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

时间:2019-07-02 16:42:29

标签: python django-rest-framework

我正在尝试创建具有多对多关系的对象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",
        }
    ]
}

1 个答案:

答案 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实例的地方,但是,这解决了我的问题。