Python Django F-object工作不正常?
我有Django模型Python Django F-object工作不正常?,python,sql,django,django-models,Python,Sql,Django,Django Models,我有Django模型 class QuestDocument(Model): document = models.ForeignKey(Document, on_delete=models.PROTECT) quest = models.ForeignKey(Quest, on_delete=models.PROTECT) is_actual = models.BooleanField() 我尝试根据条件“如果doc\u id中的document\u id,则is\u
class QuestDocument(Model):
document = models.ForeignKey(Document, on_delete=models.PROTECT)
quest = models.ForeignKey(Quest, on_delete=models.PROTECT)
is_actual = models.BooleanField()
我尝试根据条件“如果doc\u id
中的document\u id
,则is\u actual
应为真,否则为假”更新is\u actual
字段。
我试过这个:
QuestDocument.objects.filter(quest_id=q.id).update(is_actual=F('document_id') in doc_ids)
但生成了以下SQL:
UPDATE "quest_document" SET "is_actual" = false WHERE "quest_document"."quest_id" = 1;
我希望SQLcase
使用。现在我不明白为什么要得到这样的SQL
p.S.问题通过以下方式解决:
QuestDocument.objects.filter(quest_id=q.id).update(is_actual=Case(When(document_id__in=doc_ids, then=True), default=False))
但是现在我想了解,当我在doc\u id中使用
update(is\u actual=F('document\u id'))时会发生什么情况回答最后一个问题-“但是现在我想了解,当我使用”时会发生什么情况。实际上这很简单,现在F('document_id')是一个对象
>>> type(F('document_id'))
<class 'django.db.models.expressions.F'>
>类型(F('document_id'))
所以,当您在doc_id)中写入F('document_id')时,它将在构造sql查询之前进行计算,并变为True或False