【发布时间】: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