Python Django Rest Framework可写嵌套序列化程序缺少m2m字段内容
我正在尝试创建对象A,创建对象B,它们是多对多关系。我已经读了一段时间了,我在serializer中创建了自定义的Python Django Rest Framework可写嵌套序列化程序缺少m2m字段内容,python,django-rest-framework,Python,Django Rest Framework,我正在尝试创建对象A,创建对象B,它们是多对多关系。我已经读了一段时间了,我在serializer中创建了自定义的create()方法,以在创建对象时创建关联的B对象,但在validated\u数据中没有B内容的痕迹。 我的模型: A类(models.Model): name=models.CharField('name',最大长度=250) description=models.TextField('Content') timestamp=models.DateTimeField('times
create()
方法,以在创建对象时创建关联的B对象,但在validated\u数据中没有B内容的痕迹。
我的模型:
A类(models.Model):
name=models.CharField('name',最大长度=250)
description=models.TextField('Content')
timestamp=models.DateTimeField('timestamp',auto\u now\u add=True)
b_field=models.ManyToManyField(b,blank=True,null=True,verbose_name='b',related_name='a')
B类(型号.型号):
name=models.CharField('name',最大长度=250)
description=models.TextField('description')
timestamp=models.DateTimeField('timestamp',auto\u now\u add=True)
和A
序列化程序:
类序列化程序(serializers.ModelSerializer):
b=串行化器(多个=真,必需=假)
类元:
型号=A
字段='\uuuu所有\uuuu'
只读字段=['pk','timestamp']
def创建(自我验证的_数据):
bs=已验证的_数据.pop('b')
a=a.objects.create(**已验证的_数据)
对于bs中的b:
B.对象。创建(**B)
归还
我一直在使用create()
方法打印validated\u data
的内容,看起来是这样的:
{'name': 'test', 'description': 'none'}
{
"name": "test",
"description": "none",
"b": [
{
"id": 1,
"name": "b test",
"description": "none b",
}
]
}
因此,没有B
内容的痕迹。我一直在和邮递员一起测试,发送这样的邮件:
{'name': 'test', 'description': 'none'}
{
"name": "test",
"description": "none",
"b": [
{
"id": 1,
"name": "b test",
"description": "none b",
}
]
}
好吧,所以我设法自己解决了(几乎)。
首先,我更改了我的A
序列化程序,因此它现在继承了上述包中的WritableNestedModelSerializer
之后的内容。由于这一点,b
的内容现在在传递给create()
方法的validated\u数据中可见。说到这里,根据我所读到的(以及问题本身中可以看到的),需要在Overwritedcreate()
方法中创建m2m对象。我的现在看起来像这样:
def create(self, validated_data):
bs_data = validated_data.pop('b')
a = self.Meta.model.objects.create(**validated_data)
for b_data in bs_data:
b = B.objects.create(**b_data)
a.b.add(b)
return a
在这个序列化程序中仍然有验证B
实例的地方,但是可以说,这解决了我的问题