我正在尝试创建具有多对多关系的对象A,对象B。我已经阅读了一段时间,并且在序列化程序中创建了自定义create()
方法,以在创建A对象时创建关联的B对象,但是validated_data
中没有B内容的痕迹。
我的模特:
class A(models.Model):
name = models.CharField('Name', max_length=250)
description = models.TextField('Content')
timestamp = models.DateTimeField('Timestamp', auto_now_add=True)
b_field = models.ManyToManyField(B, blank=True, null=True, verbose_name='b', related_name='a')
class B(models.Model):
name = models.CharField('Name', max_length=250)
description = models.TextField('Description')
timestamp = models.DateTimeField('Timestamp', auto_now_add=True)
和A
序列化器:
class ASerializer(serializers.ModelSerializer):
b = BSerializer(many=True, required=False)
class Meta:
model = A
fields = '__all__'
read_only_fields = ['pk', 'timestamp']
def create(self, validated_data):
bs = validated_data.pop('b')
a = A.objects.create(**validated_data)
for b in bs:
B.objects.create(**b)
return a
我一直以validated_data
的方式开始打印create()
的内容,看起来像这样:
{'name': 'test', 'description': 'none'}
因此,没有任何B
内容的痕迹。我一直在与邮递员进行测试,发送如下内容:
{
"name": "test",
"description": "none",
"b": [
{
"id": 1,
"name": "b test",
"description": "none b",
}
]
}
答案 0 :(得分:0)
好的,所以我设法自己解决了(几乎)。 drf-writtable-nested to the rescue。
首先,我更改了A
序列化程序,因此它现在从上述软件包继承WritableNestedModelSerializer
之后。因此,b
的内容现在在传递给validated_data
方法的create()
中可见。说到这些,从我读过的内容(以及在问题本身中可以看到的内容)来看,有必要以覆盖的create()
方法创建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
实例的地方,但是,这解决了我的问题。