2016-11-12 66 views
0

使用django和django-rest-framework实现以下api的正确方法是什么?第一模型在Django rest框架中请求带有id列表的多对多关系

模型

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

响应

得到这个模型,其中多对多的关系呈现嵌套串行器时,期望的响应:

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

请求是关键部分:让api收到一个lis t主键,并在后端创建用户 - >聊天关系。

请求

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

因此,我怎么允许创建一个带有许多的目的是一对多的关系这样的要求。

编辑

我一直在尝试这种使用ChatRequestSerializer类,让用户现场像这样

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

和处理通过重写串行的create方法创建的关系来实现。这不工作,因为它引发错误:“ManyRelatedManager”对象不是可迭代

+0

这个问题更像是:我有这个* *我想* *说。但是,我如何做这件事的主要部分缺失。你到现在为止尝试过什么? –

+0

我编辑了我的问题来解释我到目前为止所做的工作 – matteok

回答

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

+0

输入格式错误,带有两个'id'键。 – Koterpillar

+0

输入示例已修复。 – zymud