为什么跨度关系查询与get
一起使用而不与create
一起使用是否可以使其有效?
一些背景知识:
目前我正在做类似
的事情qm = questionModel.object.get(question=quest)
answer = modelInterviewAnswer.objects.create(patient=patientobj,question=qm )
现在我知道这样的事已经有效了
modelInterviewAnswer.objects.get(patient=patientobj,question__question=quest )
我的问题是,为什么此类内容仅适用于get
而不适用于create
modelInterviewAnswer.objects.create(patient=patientobj,question__question=quest )
更新
这是我尝试使用
时遇到的错误 modelInterviewAnswer.objects.create(patient=patientobj,question__question=quest )
'question__question' is an invalid keyword argument for this function
所以我的问题是为什么question__question
可以使用get,但是当我使用它时,我会得到一个异常。
答案 0 :(得分:1)
嗯,你必须明确你的意思"它不起作用"。理论上它确实有效 - 你确实可以通过调用RandomClass.objects.create(field1='field-1-value', field2='field-2-value')
创建对象并且它可以工作。如果它"工作"对于.get()
并且没有"#34;工作"对于.create()
(我假设您在尝试该代码时遇到某种异常),那么一个原因可能是get()
从数据库中检索到现有对象并且可以填充所有必需的字段值DB,而.create()
将新对象插入到数据库中,如果缺少某些必需值,则会出现异常。
替代或解决方案是不使用基本数据库命令的create()
,而是使用Django中间模型实例来创建对象。基本上差异如下:
from django.db import models
class RandomModel(models.Model):
# NB! Required fields
field1 = models.CharField(max_length=32)
field2 = models.CharField(max_length=32)
# This is how you want to do it
RandomModel.objects.create(field1='value')
# An error is returned because you didn't specify a value for field2 and this goes directly to DB
# An alternative:
obj = RandomModel(field1='value')
obj.field2 = 'value232'
obj.save() # Only here is it saved to the DB
如果您正在寻找更具体的答案,请相应地更新您的问题。
编辑:
因为字段question
位于另一个模型中,并且您无法使用一个模型的create()
方法更改其他模型的字段。但是,您可以使用.get()
,.filter()
,.exclude()
等方法根据字段值过滤现有对象。
为了实现你想要的,你必须做以下事情(不是唯一的方法,请注意):
# if the question instance exists and you just want to change the question (kind of unlikely in my opinion?)
question_instance = QuestionModel.objects.get(#some-params-that-get-the-question)
question_instance.question = 'How the hell did we end up here?'
question_instance = question_instance.save()
# Proceed to create the other model
# if the question instance does not exist (more likely version)
question = QuestionModel.objects.create(question='Is this more like it?')
answer = AnswerModel.objects.create(answer='Yes, it is.', question=question)