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/" } ]
风月都好看,人间也浪漫.