将字段元数据添加到 django-rest-framework 序列化器

uta*_*ngo 5 django django-rest-framework

我正在使用 django-rest-framework 编写一个 API,用于在前端显示自定义表。

我需要将元数据添加到模型序列化器返回的 json 中:

  • 为几乎所有字段提供自定义显示名称;
  • 将某些字段标记为不可排序,以便相应列的 UI 中不显示排序控件;
  • 指定窄列的标题旋转角度。

我尝试用谷歌搜索这个,但我发现的只是如何将自定义非模型字段添加到ModelSerializer.

sir*_*lot 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,
            }
       }
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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


REST_FRAMEWORK = {
    'DEFAULT_METADATA_CLASS': 'myproject.serializers.ExtraMetadata'
}
Run Code Online (Sandbox Code Playgroud)