HyperlinkedModelSerializer类与ModelSerializer类类似,不同之处在于它使用超链接来表示关系,而不是主键。
默认情况下,序列化程序将包括一个 url
字段,而不是主键字段。
url
字段将使用 HyperlinkedIdentityField
序列化程序字段来表示,模型上的任何关系都将使用 HyperlinkdRelatedField
序列化器字段来表示。
通过将主键添加到字段选项中,可以显式地包含主键,例如:
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
fields = ['url', 'id', 'account_name', 'users', 'created']
1 绝对URL和相对URL
实例化HyperlinkedModelSerializer时,必须在序列化程序上下文中包含当前 request
,例如:
serializer = AccountSerializer(queryset, context={'request': request})
这样做将确保超链接可以包括适当的主机名,以便生成的表示使用完全限定的URL
2 如何确定超链接视图
需要有一种方法来确定哪些视图应该用于到模型实例的超链接。
默认情况下,超链接应对应于与样式 '{model_name}-detail'
匹配的视图名称,并通过 pk
关键字参数查找实例。
您可以通过使用 extra_kwargs
设置中的 view_name
和 lookup_field
选项之一或两者来覆盖URL字段视图名称和查找字段,如下所示:
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
fields = ['account_url', 'account_name', 'users', 'created']
extra_kwargs = {
'url': {'view_name': 'accounts', 'lookup_field': 'account_name'},
'users': {'lookup_field': 'username'}
}
或者,您可以显式设置序列化程序上的字段。例如:
class AccountSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name='accounts',
lookup_field='slug'
)
users = serializers.HyperlinkedRelatedField(
view_name='user-detail',
lookup_field='username',
many=True,
read_only=True
)
class Meta:
model = Account
fields = ['url', 'account_name', 'users', 'created']
提示:将超链接表示和URLconf正确匹配在一起有时会有点麻烦。打印HyperlinkedModelSerializer
实例的 repr
是一种特别有用的方法,可以准确地检查关系应该映射的视图名称和查找字段。
3 更改URL字段名称
URL字段的名称默认为 url
。通过使用 URL_FIELD_NAME
设置,可以全局覆盖此项。