get_or_create返回错误,当我使用过滤器检查相同参数时,它存在多个对象值,它返回0个对象

时间:2017-06-27 00:11:25

标签: django django-models orm django-orm

我正在尝试使用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) 调用失败。

1 个答案:

答案 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