Loading

15.关系和超链接

 
如图所示,snippets返回的对应的ID列表,我们可以把冰冷的字段转化为可以跳转的对应ID的url链接跳转对应的ID详情
 
使用:
我们需要修改序列化类继承serializers.HyperlinkedModelSerializer,而不再继承serializers.ModelSerializer
HyperlinkedModelSerializer类是drf为我们提高的用于实现超链接模型序列化器的父类
HyperlinkedModelSerializer与ModelSerializer有以下区别
 
  • 默认情况下不包括ID字段
  • 自带一个url字段,使用HyperlinkedRelatedField
  • 关联关系使用HyperlinkedRelatedField而不是使用PrimaryKeyRelatedField
 
# serializer.py
class SnippetSerizlizer(serializers.HyperlinkedModelSerializer):

    owner = serializers.ReadOnlyField(source='owner.username')
    # serializers.HyperlinkedIdentityField:超链接的标识字段
    # view_name:用哪个视图去处理
    highlighted = serializers.HyperlinkedIdentityField(view_name='snippet-highlight',format='html')

    class Meta:
        model = Snippet
        # 在序列化内容中添加url字段,继承了HyperlinkedModelSerializer会自动有url字段
        fields = ('url','id', 'title', 'code', 'linenos', 'owner','highlighted',)


class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = serializers.HyperlinkedRelatedField(many=True,view_name= 'snippet-detail',read_only=True)

    class Meta:
        model = User
        fields = ('url','id', 'username', 'snippets',)
#urls.py
#路由中使用name字段定义名称,与序列化类中要使用的视图名称一致匹配
path('snippets/<int:pk>/', views.SnippetDetail.as_view(),name='snippet-highlight'),
path('users/<int:pk>', views.UserDetail.as_view(),name='snippet-detail'),
# 接口内容
# 可以看到url自动生成的跳转地址
# 以及 生成的字典highlighted生成的超链接地址
[
    {
        "url": "http://127.0.0.1:8000/users/1",
        "id": 1,
        "title": "python",
        "code": "test",
        "linenos": false,
        "owner": "liqi",
        "highlighted": "http://127.0.0.1:8000/snippets/1/"
    },
    {
        "url": "http://127.0.0.1:8000/users/2",
        "id": 2,
        "title": "python",
        "code": "test",
        "linenos": false,
        "owner": "liqi",
        "highlighted": "http://127.0.0.1:8000/snippets/2/"
    }
]

 

posted @ 2022-04-30 15:10  木子七  阅读(95)  评论(0编辑  收藏  举报