首页 > 解决方案 > Django Rest Framework 可写嵌套序列化程序缺少 m2m 字段内容

问题描述

我正在尝试创建对象 A,创建对象 B,它们是多对多关系。我已经阅读了一段时间,并且我create()在序列化程序中创建了自定义方法来在创建 A 对象时创建关联的 B 对象,但是在validated_data. 我的模型:

    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",
        }
    ]
}

标签: pythondjango-rest-framework

解决方案


好的,所以我设法自己解决了(几乎)。drf-writtable-nested 来救援。首先,我更改了我的A序列化程序,因此它现在继承WritableNestedModelSerializer自上述包之后。多亏了这一点,现在在传递给方法中的内容b是可见的。说到这一点,从我所阅读的内容(以及可以在问题本身中看到的内容)来看,需要以覆盖的方法创建 m2m 对象。我的现在看起来像这样:validated_datacreate()create()

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


推荐阅读