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

sz81bmfz  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(120)

我正在使用django-rest-framework编写一个API,用于在前端显示自定义表。
我需要将元数据添加到模型序列化器返回的json中:

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

我试着在谷歌上搜索这个,但我发现的只是如何向ModelSerializer添加一个自定义的非模型字段。

soat7uwm

soat7uwm1#

可以通过extra_kwargs修改标签来修改显示名称,extra_kwargs为派生字段示例提供参数。另一个元数据有点棘手。因此,我们在元类中引入自己的dict 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框架使用我们的自定义元数据生成器:

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

相关问题