加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:37:25 所属栏目:Python 来源:网络整理
导读:我正在使用 django的rest框架来显示有关用户的信息.每个用户都有一些保存在UserProfile中的联系人(用户配置文件使用一对一的关系来使用).可以在用户模型中直接访问联系人(user.contacts). 我想显示用户所有联系人的姓名(和URL).我写了以下序列化器: class C
我正在使用 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/","contacts": [
    {
      "url": "http://link_to_user","username": "foo"
    },{
      "url": "http://link_to_user","username": "bar"
    }
  ]
}

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

解决方法

您的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",)

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读