【问题标题】:Django Rest Framework - User Profile in nested UserDjango Rest Framework - 嵌套用户中的用户配置文件
【发布时间】:2014-08-29 20:56:36
【问题描述】:

我正在使用 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' object is not iterable 并且 JSON 结构看起来有点尴尬:{contacts: [ user: {"username": ... },]},如果 API 的用户对 Django 的用户配置文件没有信心,这可能会使他感到困惑。

【问题讨论】:

    标签: django nested django-rest-framework


    【解决方案1】:

    您的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 将是默认视图名称,如果您使用路由器或遵循教程。您可能需要调整它以匹配您的详细视图名称。

    【讨论】:

    • 完美运行,但应该是HyperlinkedRelatedField(或HyperlinkedIdentityField)而不是HyperlinkedModelSerializer
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2019-06-02
    • 2018-07-14
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多