我们需要在 Web API 设计中实现实体之间的关系。
有几种方法可以做到这一点(如 DRF 文档中所述):
- 使用主键。
- 在实体之间使用超链接。
- 在相关实体上使用唯一标识 slug 字段。
- 使用相关实体的默认字符串表示。
- 将相关实体嵌套在父表示中。
- 其他一些自定义表示
HyperlinkedModelSerializer 与 ModelSerializer 有以下区别:
- 默认不包含id字段。
- 它包含一个 url 字段,使用 HyperlinkedIdentityField。
- 关系使用 HyperlinkedRelatedField,而不是 PrimaryKeyRelatedField。
一个简单的例子:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name')
bash> http -a admin:yourpassword http://127.0.0.1:8000/users/
"results": [
{
"email": "admin@min.com",
"groups": [
"http://127.0.0.1:8000/groups/1/",
"http://127.0.0.1:8000/groups/2/"
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]
但是如果你改变了
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
结果将是:
"results": [
{
"email": "admin@min.com",
"groups": [
1,
2
],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
}
]