python - 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",
}
]
}
解决方案
好的,所以我设法自己解决了(几乎)。drf-writtable-nested 来救援。首先,我更改了我的A
序列化程序,因此它现在继承WritableNestedModelSerializer
自上述包之后。多亏了这一点,现在在传递给方法中的内容b
是可见的。说到这一点,从我所阅读的内容(以及可以在问题本身中看到的内容)来看,需要以覆盖的方法创建 m2m 对象。我的现在看起来像这样:validated_data
create()
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
实例的地方,但是可以说,这解决了我的问题。
推荐阅读
- rust - Rust 中的盒装函数工厂(高阶函数)导致“调用表达式需要函数”
- python - CPython 和 PyPy 十进制运算性能
- blazor - 预渲染 blazor webassembly 网站 .net 标准 2.1 失败
- python - 在 Mayavi 中对多个标量场进行体积切片
- postgresql - 以下场景会导致 PostgreSQL DB 死锁吗?
- c - 指向指针别名和限制关键字的指针
- c# - 如何检查对象的字符串列表中的项目是否也存在于具有相同标识符的不同对象的其他字符串列表中?
- c# - 我应该如何构建一个 SortedDictionary
来自 IEnumerable >? - c# - 使用 razorpages 实体框架处理完整日历
- hibernate - java.sql.SQLTransientConnectionException: (conn=15) 表太多;MariaDB 在一个连接中只能使用 61 个表