Loading

34.HyperLinkedModelSerializer详解

  • HyperLinkedModelSerializer继承ModelSerializer,只是自动多出了一个url字段,其他都是一样的
  • 不同之处在于使用超链接来表示关联关系而不是主键
  • 默认情况下HyperLinkedModelSerializer序列化器包含一个url字段
  • url字段使用HyperlinkedIdentityField字段表示,模型的任何关联都使用该字段
 #源码
 
 class HyperlinkedModelSerializer(ModelSerializer):

    serializer_related_field = HyperlinkedRelatedField

    def get_default_field_names(self, declared_fields, model_info):
        # 覆盖重写了ModelSerializer中的方法
        # 只是在 第一个变量使用了url名字
        return (
            [self.url_field_name] +
            list(declared_fields) +
            list(model_info.fields) +
            list(model_info.forward_relations)
        )

    def build_nested_field(self, field_name, relation_info, nested_depth):
        # 覆盖重新ModelSerializer方法,嵌套的子类依然继承的是HyperLinkedModelSerializer
        class NestedSerializer(HyperlinkedModelSerializer):
            class Meta:
                model = relation_info.related_model
                depth = nested_depth - 1
                fields = '__all__'

        field_class = NestedSerializer
        field_kwargs = get_nested_relation_kwargs(relation_info)

        return field_class, field_kwargs
 
 #示例
 # 继承HyperlinkedModelSerializer
 class TextSerializer(HyperlinkedModelSerializer):
    auth = AuthSerializer()

    class Meta:
        model = Text
        # 设置url字段
        fields = ('url','id', 'title', 'content', 'auth', 'category', 'created')
 
原来category的值是 对应的id 1和2,现在是对应的超链接,点击可以直接跳到对应分类
 
修改url字段名

'''
使用HyperLinkedModelSerializer生成的url,字段名默认是url
如果想要修改的话需求在setting中指定,比如我们要把url字段名改成to_link
''' 
REST_FRAMEWORK = {
    'URL_FIELD_NAME':'to_link'
}
 

posted @ 2022-10-08 15:54  木子七  阅读(361)  评论(0编辑  收藏  举报