gpt4 book ai didi

python - Django Rest Framework 嵌套序列化程序现有实例

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:54 25 4
gpt4 key购买 nike

我有一个嵌套的 ModelSerializer,但我在验证时遇到了问题。

我遇到的问题是,在创建父序列化程序时,我可能需要也可能不需要创建嵌套序列化程序/模型,因为它可能已经存在于数据库中,我只想链接到它。

代码设置:

模型.py

class ModelA(models.Model):
modelb = ForeignKey(ModelB, null=true, blank=true)
...

class ModelB(models.Model):
...

序列化程序.py

class ModelASerializer(serializers.ModelSerializer):
modelb = ModelBSerializer(required=False)

class Meta:
model = ModelA
depth = 1

class ModelBSerializer(serializers.ModelSerializer):
class Meta:
model = ModelB

因此,给定 3 个数据场景,我在所有 3 个场景中都遇到了验证错误。

首先,如果我像这样将 NestedModel 作为数据传递

data = {
'nestedmodel': NestedModel(**args),
...
}

我收到验证错误,说有一个 non_field_error 并且它需要一个字典但得到了一个 NestedModel 实例。

其次,如果我传递 NestedModel 的数据(而不是对象):

data = {
'nestedmodel': {'id': 'this', ... },
}

由于嵌套模型具有唯一键(“id”)并且该键已存在于数据库中,因此我得到了等效于重复键的验证错误。

第三,如果我只是将 nestedmodel 的 id 传递给它,我会得到与第一种情况类似的错误,除了它说它得到的是 Unicode 而不是 NestedModel 实例。

data = {
'nestedmodel': 'this',
}

我理解为什么所有这三种情况都会发生并且验证失败,但这对我尝试链接已经存在的 NestedModel 的目标没有帮助。

我该怎么做?我做错了什么?

最佳答案

你能试试这个吗:

序列化程序.py

class ModelASerializer(serializers.ModelSerializer):
modelb = ModelBSerializer(required=False)

class Meta:
model = ModelA
depth = 1
fields = ('id', 'modelb', )

def create(self, validated_data):
modelb_id = self.validated_data.pop("nestedmodel")
modelb = ModelB.objects.get(id=modelb_id["id"])
modela = ModelA.objects.create(modelb=modelb, **validated_data)
return modela

按如下方式传递数据:

输入

data = {"nestedmodel": {"id": 1 # add nestedmodel fields here}, }



关于python - Django Rest Framework 嵌套序列化程序现有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32659962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com