Skip to main content
 首页 » 编程设计

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

2025年05月04日32jirigala

我有一个嵌套的 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}, }