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

Mat*_*o12 3 django nested django-rest-framework

我正在使用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")
Run Code Online (Sandbox Code Playgroud)

哪个回归

{
  "url": "http:\/\/localhost:8080\/users\/1\/",
  "username": "test1",
  "email": "",
  "contacts": [
    {
      "user": 2
    },
    {
      "user": 1
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

但我希望它是:

{
  "url": "http:\/\/localhost:8080\/users\/1\/",
  "username": "test1",
  "email": "",
  "contacts": [
    {
      "url": "http://link_to_user",
      "username": "foo"
    },
    {
      "url": "http://link_to_user",
      "username": "bar"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我已经尝试为联系人用户添加另一个序列化程序但是引发了类型错误:"用户"对象不可迭代,JSON结构看起来有点尴尬:{contacts:[user:{"username":... },]},如果他对Django的用户配置文件没有信心,可能会混淆API的用户.

Kev*_*own 7

ContactsSerializer需要成为一个自动添加字段的HyperlikedModelSerializer顺序url.由于您需要该url字段指向不同的模型,因此您实际上需要使用a 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", )
Run Code Online (Sandbox Code Playgroud)

您可以将source参数用于字段,以使用模型上的不同字段而不是显示的字段.在这种情况下,我们使用user配置文件中关系的字段.

user-detail如果您使用路由器或遵循教程,它将是默认视图名称.您可能需要调整此项以匹配您的详细信息视图名称.