Django Rest框架-嵌套用户中的用户配置文件

Django Rest框架-嵌套用户中的用户配置文件,django,nested,django-rest-framework,Django,Nested,Django Rest Framework,我正在使用django的rest框架来显示有关用户的信息。每个用户都有一些保存在UserProfile中的联系人(用户配置文件使用一对一关系)。可以在用户模型中直接访问联系人(user.contacts)。 我想显示用户所有联系人的姓名(和URL)。我编写了以下序列化程序: class ContactsUserSerializer(serializers.ModelSerializer): class Meta: model = get_user_model()

我正在使用django的rest框架来显示有关用户的信息。每个用户都有一些保存在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"
    }
  ]
}

我怎样才能做到这一点?我已经尝试为联系人用户添加另一个序列化程序,但这会引发一个类型错误:“User”对象不可编辑,JSON结构看起来有点笨拙:{contacts:[用户:{“username”:…},]},如果API用户对Django的用户配置文件没有信心,这可能会让他感到困惑

为了自动添加
url
字段,您的
联系人序列化程序需要是一个
超链接的ModelSerializer
。由于需要
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
关系


用户详细信息
将是默认视图名称,如果您正在使用路由器或遵循教程。您可能需要调整此字段以匹配详细视图名称。

工作正常,但它应该是
HyperlinkedRelatedField
(或
HyperlinkedEntityField
)而不是
HyperlinkedModelSerializer