使用span like格式创建对象。那可能吗?

时间:2017-01-22 11:20:30

标签: python django django-models django-views django-queryset

为什么跨度关系查询与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,但是当我使用它时,我会得到一个异常。

1 个答案:

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