给Django-rest-framework序列化器添加字段元数据

5
我正在使用django-rest-framework编写API,用于在前端显示自定义表格。
我需要为模型序列化器返回的json添加元数据:
- 为几乎所有字段提供自定义显示名称; - 标记某些字段为不可排序,以便在对应列的UI中不显示排序控件; - 指定窄列的标题旋转角度。
我尝试通过搜索获得解决方案,但我找到的所有内容都是如何为ModelSerializer添加自定义非模型字段。请帮助我解决这个问题。

1
我在尝试做同样的事情。如果我搞清楚了,我会告诉你的。:) - Cameron
1个回答

0
显示名称可以通过修改标签来进行修改,方法是通过 extra_kwargs 提供参数给派生字段实例。其他元数据稍微复杂一些。因此,我们在元类中引入一个自定义的字典 extra_meta。例如,
class ContactSerializer(serializers.ModelSerializer):

    class Meta:
        model = sfmodels.Contact

        fields = [
            "first_name",
        ]        
        
        extra_kwargs = {
            "first_name": {
                "label": _("Your name"),
            }
        }
        
        extra_meta = {
            "first_name": {
                "sortable": False,
                "header_rotation_angle": 45,
            }
       }

现在,我们扩展元数据生成器以使用额外的数据:

from rest_framework.metadata import SimpleMetadata

class ExtraMetadata(SimpleMetadata):

    def get_serializer_info(self, serializer):
        """
        Given an instance of a serializer, return a dictionary of metadata
        about its fields.
        """
        # retrieve meta kwargs if provided
        extra_meta = copy.deepcopy(getattr(serializer.Meta, 'extra_meta', {}))

        # call the original implementation
        field_infos = super().get_serializer_info(serializer)

        # and add meta kwargs to the fields
        for field_name, field in field_infos.items():
            if field_name in extra_meta:
                for key, value in extra_meta[field_name].items():
                    field[key] = value
        return field_infos

最后,我们告诉框架使用我们自定义的元数据生成器:使用我们自定义的元数据生成器

REST_FRAMEWORK = {
    'DEFAULT_METADATA_CLASS': 'myproject.serializers.ExtraMetadata'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接