【问题标题】:Django F-object works wrong?Django F-object 工作错了吗?
【发布时间】:2018-02-22 09:56:04
【问题描述】:

我有 Django 模型

class QuestDocument(Model):
    document = models.ForeignKey(Document, on_delete=models.PROTECT)
    quest = models.ForeignKey(Quest, on_delete=models.PROTECT)
    is_actual = models.BooleanField()

我尝试根据条件更新is_actual 字段“如果doc_ids 中的document_idis_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;

我预计 SQL case 会使用。现在不明白为什么要得到这样的SQL。

附:问题解决了

QuestDocument.objects.filter(quest_id=q.id).update(is_actual=Case(When(document_id__in=doc_ids, then=True), default=False))

但现在我想了解,当我使用update(is_actual=F('document_id') in doc_ids) 时会发生什么

【问题讨论】:

    标签: python sql django django-models


    【解决方案1】:

    回答最后一个问题 - “但现在我想了解,我使用时会发生什么”。其实很简单,现在 F('document_id') 是一个对象

    >>> type(F('document_id'))
    <class 'django.db.models.expressions.F'>
    

    因此,当您在 doc_ids 中写入 F('document_id') 时,它会在构造 sql 查询之前被评估,并变为 True 或 False。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2011-06-07
      相关资源
      最近更新 更多