请求django rest framework

时间:2016-11-12 15:57:47

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

使用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'对象不可迭代

1 个答案:

答案 0 :(得分:0)

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

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