Python 如何使DRF Serializer create()函数只创建一个尚不存在的条目?

Python 如何使DRF Serializer create()函数只创建一个尚不存在的条目?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有两张桌子,它们通过交叉桌子相互连接。(食谱及配料) 我的序列化程序工作正常,我可以发送POST请求,它保存了所有内容。问题在于,每当一个新配方出现时,只要说成分“Milk”,我的序列化程序就会在我的数据库中创建一个名为Milk的新条目,尽管我的数据库中已有一个条目“Milk”。 如何告诉序列化程序使用已存在项的Id,而不是每次为交叉表创建一个新项 以下是我认为可以修复它的方法,但显然不行: 类RecipeIngredientSerializer(serializers.ModelSerial

我有两张桌子,它们通过交叉桌子相互连接。(食谱及配料) 我的序列化程序工作正常,我可以发送POST请求,它保存了所有内容。问题在于,每当一个新配方出现时,只要说成分“Milk”,我的序列化程序就会在我的数据库中创建一个名为Milk的新条目,尽管我的数据库中已有一个条目“Milk”。 如何告诉序列化程序使用已存在项的Id,而不是每次为交叉表创建一个新项

以下是我认为可以修复它的方法,但显然不行:

类RecipeIngredientSerializer(serializers.ModelSerializer):
Component=IngerdientSerializer()
类元:
模型=配方\配料
字段=[“金额”、“单位”、“成分”]
def创建(自我验证的_数据):
成分验证的成分数据=验证的成分数据.pop('成分')
Component\u serializer=self.fields['Component']
ingredientDict=dict(成分验证数据)
//这是我试图检查是否已经有一个成分的名称从形式
IngRedientBj=Component.objects.all().filter(Component\u name=ingredientDict['Component\u name'])。
如果不是IngreditoBj:
配料_实例=配料.objects.create(**IngreditDict)
已验证的成分数据['Component']=成分实例
其他:
Component\u实例=Component\u序列化程序。创建(IngreditDict)
已验证的成分数据['Component']=成分实例
配方配料实例=配方配料.objects.create(**已验证的配料数据)
返回配方\u配料\u实例
这段代码似乎也能工作,至少我找到了一个现有的成分,但在上次create()之后,它似乎忽略了我在
validated\u data['component']
对象中插入的内容

编辑 我的模型是:

类配方配料(models.Model):
配方=模型.ForeignKey(配方,模型.CASCADE)
成分=模型.ForeignKey(成分,模型.CASCADE)
amount=models.IntegerField(默认值=0)
单位=models.CharField(最大长度=50)
定义(自我):
返回配方的self.component.component_name+“+self.Recipe.Recipe_name”
类配方(models.Model):
配方名称=models.CharField(最大长度=200)
assembly\u time=models.IntegerField(默认值=0)
服务数量=models.IntegerField(默认值=0)
tags=models.ManyToManyField(tag,blank=True)
定义(自我):
返回self.recipe\u名称
类别成分(型号.型号):
成分名称=models.CharField(最大长度=200)
配料热量=型号.IntegerField('carries per 100 Units',默认值=-1)
默认单位=models.CharField(最大长度=50)
定义(自我):
返回self.u名称

我终于得到了答案。我的错误是序列化程序中的这一行:

ingredientObj = ingredient.objects.all().filter(ingredient_name=ingredientDict['ingredient_name']).
    if not ingredientObj:
        ingredient_instance = ingredient.objects.create(**ingredientDict)
        validated_data['ingredient'] = ingredient_instance
我现在更改了它,使其看起来像这样:

ingredientObj = ingredient.objects.all().filter(ingredient_name=ingredientDict['ingredient_name']).
    if len(ingredientObj):
        ingredient_instance = ingredientObj.first()
        validated_data['ingredient'] = ingredient_instance

component.object.create(**IngreditDict)
实际上创建了一个新对象(谁知道呢;))。这可能仍然是一个丑陋的解决方案,我对更多的批评持开放态度,但目前这确实有效

你也能分享你的模型吗?我不明白
配方
模型是如何与
配方成分
模型交互的哦,是的,对不起,我忘了它们。