Python Django Rest Framework可写嵌套序列化程序缺少m2m字段内容

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

我正在尝试创建对象A,创建对象B,它们是多对多关系。我已经读了一段时间了,我在serializer中创建了自定义的
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数据中可见。说到这里,根据我所读到的(以及问题本身中可以看到的),需要在Overwrited
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
实例的地方,但是可以说,这解决了我的问题