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