【问题标题】:Django: how to annotate a comparison as an expression?Django:如何将比较注释为表达式?
【发布时间】:2021-03-04 13:25:19
【问题描述】:

我的 models.py 中有一个包含这两个字段的模型:

class Dummy(models.Model):

    timestamp1 = models.DateTimeField()
    timestamp2 = models.DateTimeField()

现在我想列出所有值,包括事实,如果时间戳 1 大于时间戳 2。我认为正确的方法是在 views.py 中使用annotate this,而不是在模板中弄清楚这一点。不幸的是,这不起作用:

from .models import Dummy

dummy = Dummy.objects.annotate(is_newer=timestamp1 > timestamp2)

我得到错误:

QuerySet.annotate() 收到非表达式:False。

好的,注释需要一个表达式,所以我尝试使用When

from .models import Dummy
from django.db.models import When

dummy = Dummy.objects.annotate(is_newer=When(timestamp1__gt=timestamp2, then=True)

这会导致以下错误消息:

name 'timestamp2' is not defined

现在我没有想法了。我该怎么办?

【问题讨论】:

标签: django


【解决方案1】:

我主要需要改进这些方面:

  1. 使用F() expression
  2. 使用Case()
  3. 使用Value() expression

这终于对我有用了:

from django.db.models import BooleanField, Case, F, Value, When
from .models import Dummy

dummy = Dummy.objects.annotate(
    is_newer=Case(
        When(timestamp1__gt=F('timestamp2'),
             then=Value(True)
             ),
        default_value=Value(False),
        output_field=BooleanField()
    )
)

我受到上面 iklinac 的评论和this answer 的启发。谢谢!

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 2010-09-18
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多