我使用django的休息框架来显示有关用户的信息。每个用户都有一些保存在UserProfile中的联系人(用户配置文件使用一对一的关系来使用)。可以在用户模型中直接访问联系人(user.contacts
)
我想显示用户所有联系人的姓名(和URL)。我写了以下序列化器:
class ContactsUserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ("username", "email")
class ContactsSerializer(serializers.ModelSerializer):
# user = ContactsUserSerializer(many=True) # raises TypeError: 'User' object is not iterable
class Meta:
model = UserProfile
fields = ("user",)
class UserSerializer(serializers.HyperlinkedModelSerializer):
contacts = ContactsSerializer(many=True)
class Meta:
model = get_user_model()
fields = ("url", "username", "email", "contacts")
返回
{
"url": "http:\/\/localhost:8080\/users\/1\/",
"username": "test1",
"email": "",
"contacts": [
{
"user": 2
},
{
"user": 1
}
]
}
但我希望它是:
{
"url": "http:\/\/localhost:8080\/users\/1\/",
"username": "test1",
"email": "",
"contacts": [
{
"url": "http://link_to_user",
"username": "foo"
},
{
"url": "http://link_to_user",
"username": "bar"
}
]
}
我怎样才能实现这一目标?我已经尝试为联系人用户添加另一个序列化程序,但这会引发类型错误:'用户'对象不可迭代,JSON结构看起来有点尴尬:{contacts:[user:{" username":...},]},如果他不是,那可能会混淆API的用户对Django的用户档案充满信心。
答案 0 :(得分:7)
您的ContactsSerializer
需要HyperlikedModelSerializer
才能自动添加url
字段。由于您需要url
字段指向其他模型,因此您实际上需要使用HyperlinkedRelatedField
并将其添加为序列化程序中的自定义字段。
class ContactsSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedRelatedField(view_name="user-detail", source="user")
username = serializers.CharField(source="user.username")
class Meta:
model = UserProfile
fields = ("url", "username", )
您可以将source
参数用于字段,以使用模型上的其他字段而不是显示的字段。在这种情况下,我们使用了个人资料中user
关系的字段。
user-detail
将是默认视图名称。您可能需要对其进行调整以匹配您的详细视图名称。