【问题标题】:request with list of id's for many to many relationship in django rest framework在 django rest 框架中请求多对多关系的 id 列表
【发布时间】:2016-11-12 15:57:46
【问题描述】:

使用 django 和 django-rest-framework 实现以下 api 的正确方法是什么。首先是模型

型号

def ChatModel(models.Model):
   users = models.ManyToManyField(User, through=ChatUser)

回应

获得这个模型时所需的响应,其中多对多关系通过嵌套序列化程序呈现:

[
  {
    "id": 1,
    "title": "gossip",
    "users": [
        {
          "id": 1,
          "name": "George"
        },
        {
          "id": 2,
          "name": "Jerry"
        }  
    ]         
  }
]

请求是关键部分:让 api 接收主键列表并在后端创建用户 -> 聊天关系。

请求

{
  "title": "gossip",
  "users": [1,2]
}

那么我如何允许这样的请求创建具有多对多关系的对象。

编辑

我一直在尝试使用 ChatRequestSerializer 类来实现这一点,该类使用户字段类似于这样

 users = serializers.ListField(child=serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all()))

并通过覆盖序列化程序的create 方法来处理创建关系。这不起作用,因为它会引发错误:'ManyRelatedManager' 对象不可迭代

【问题讨论】:

  • 这个问题更像是:我有this,我想要that。但是与我这样做的如何相关的主要部分丢失了。到现在为止你尝试了什么?
  • 我已经编辑了我的问题以解释我到目前为止所做的事情

标签: python django rest django-rest-framework many-to-many


【解决方案1】:

您可以使用嵌套序列化程序:

class NestedUserSerializer(serializers.ModelSerializer):
    class Meta(object):
        model = models.User
        fields = ('id', 'name')
        readonly_fields = ('name',)


class ParentSerializer(serializers.ModelSerializer):
    users = NestedUserSerializer(many=True)

    class Meta(object):
        model = models.Parent
        fields = ('id', 'title', 'users')

    def create(self, validated_data):
        user_ids = {u['id'] for u in validated_data.pop('users', [])}
        parent = super(ParentSerializer, self).create(validated_data)
        # create users here
        return parent

代码未经测试。但我希望它能证明我的想法。

请注意,输入应如下所示:

{
    "title": "gossip",
    "users": [{"id": 1}, {"id": 2}]
}

你也可以查看这个答案:django rest framework nested fields with multiple models

【讨论】:

  • 输入格式错误,有两个id键。
  • 输入示例已修复。
  • OP 想要的请求负载如下:{ "title": "gossip", "users": [1,2] } 但你的例子与 OP 想要的不同。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多