【问题标题】:get_or_create returning error that multiple value of objects exist when I check same parameters with filter it retuns 0 objectsget_or_create 返回错误,当我使用过滤器检查相同的参数时存在多个对象值,它会返回 0 个对象
【发布时间】:2017-11-29 22:18:01
【问题描述】:

我正在尝试使用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 是空的。既然我明确指定并为 abnormalBodyPart 分配了一个值,为什么 django 会说那两个项目已经存在?我希望这是有道理的 。

假设有两个语句 1 和 2,让 e 用另一种方式解释。 语句 1 根据指定的参数获取或创建记录。由于 django 认为已经有两条记录,因此获取或创建失败。但是语句 2 使用相同的确切参数并返回 0 条记录。这是为什么 ?我在这里错过了什么并且不理解?

声明 1:

exams.modelStudentExamsPerformed.objects.get_or_create()(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0],normalBodyPart=None,date=None)

当此表中显然没有任何对象具有abnormalBodyPart 的值时。我通过执行以下操作验证了这一点

声明 2:

k = exams.modelStudentExamsPerformed.objects.filter(patient=patient_qset, student=stud_qset,abnormalBodyPart=qset[0], normalBodyPart=None,date=None)

上面的语句 2 没有返回任何东西。我的问题是为什么声明 2 没有返回任何内容,而声明 1 抱怨已经有 2 个项目因此未能通过 get 调用。

【问题讨论】:

  • 你真的有 get_or_create ()( patient=patient_qset....?想想看。你用空参数获取或创建一个对象,然后调用它的 __call__( ) 方法。松开 )(.
  • 是的,这是有道理的,我是从网上的一个例子中得到的。我猜他们有错字,我只是复制了他们的错字
  • @Melvyn 成功了。你能把它放在答案中

标签: django django-models orm django-orm


【解决方案1】:

您正在调用不带参数的 get_or_create(),然后在结果实例上调用 __call__() 方法。

将关键字放在get_or_create 中,使其正常工作。还要再次研究方法签名:您缺少 defaults 参数。该方法的工作原理如下:

  • 过滤提供的关键字参数,“默认值”除外
  • 如果没有返回任何内容,请使用这些关键字参数创建一个新实例并使用“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2013-07-04
    • 1970-01-01
    • 2012-02-22
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多