我正在尝试使用get_or_create
方法来查看记录是否存在。如果记录存在则不做任何其他操作。
此模型基本上用于失败的命令
class modelStudentExamsPerformed(models.Model):
patient = models.ForeignKey(modelPatient)
student = models.ForeignKey(modelStudent,on_delete=models.CASCADE)
normalBodyPart = models.ForeignKey(modelNormalBodyPartResult,default=None,blank=True,null=True)
abnormalBodyPart = models.ForeignKey(modelAbnormalBodyPartResult,default=None,blank=True,null=True)
tool = models.CharField(max_length=128, default="")
现在这是使用上述模型并失败的命令
exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)
以上陈述给出了错误:
get() returned more than one modelStudentExamsPerformed -- it returned 2!
现在这是我遇到麻烦的地方。当我通过我的管理员查看数据库时,我注意到两个对象,但这些对象都有一个与normalBodyPart
相关联的值,并且它们的abnormalBodyPart
是空的。因为我明确指定并为{{1为什么django说两个项目已经存在?我希望这是有道理的 。
让我们用另一种方式解释,假设有两个陈述1和2。 语句1根据指定的参数获取或创建记录。由于django认为已有两条记录,因此获取或创建失败。但是,语句2使用相同的确切参数并返回0记录。这是为什么 ?我错过了什么而不是在这里理解?
声明1:
abnormalBodyPart
当显然,此表中的任何对象都没有exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)
的值。我通过执行以下操作验证了这一点
声明2:
abnormalBodyPart
以上声明2不会返回任何内容。我的问题是,为什么声明2没有返回任何内容,而声明1抱怨已经有2个项目因此k = exams.modelStudentExamsPerformed.objects.filter(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0], normalBodyPart=None,date=None)
调用失败。
答案 0 :(得分:4)
您在没有参数的情况下调用get_or_create()
,然后在生成的实例上调用__call__()
方法。
将关键字放在get_or_create
中以使其正常工作。还要再次研究方法签名:您错过了defaults
参数。该方法的工作方式如下:
有时,最好说明一下:
instance, created = Players.objects.get_or_create(
username='Lagolas',
defaults={'class': 'ranger', 'gender': 'male'}
)
相当于:
try:
instance = Players.objects.get(username='Lagolas')
return instance, False
except Players.DoesNotExist:
instance = Players.objects.create(
username='Lagolas', class='ranger', gender='male'
)
return instance, True