Django:如何将比较注释为表达式?

Django:如何将比较注释为表达式?,django,Django,我的模型中有一个模型包含这两个字段。py: class Dummy(models.Model): timestamp1 = models.DateTimeField() timestamp2 = models.DateTimeField() 现在我想列出所有值,包括事实,如果timestamp1大于timestamp2。我认为正确的方法应该是在views.py中找到它,而不是在模板中找到它。不幸的是,这不起作用: from .models import Dummy dumm

我的模型中有一个模型包含这两个字段。py

class Dummy(models.Model):

    timestamp1 = models.DateTimeField()
    timestamp2 = models.DateTimeField()
现在我想列出所有值,包括事实,如果timestamp1大于timestamp2。我认为正确的方法应该是在views.py中找到它,而不是在模板中找到它。不幸的是,这不起作用:

from .models import Dummy

dummy = Dummy.objects.annotate(is_newer=timestamp1 > timestamp2)
我得到一个错误:

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

好的,annotate需要一个表达式,所以我尝试使用:

这将导致以下错误消息:

name 'timestamp2' is not defined

现在我没有主意了。我该怎么办?

我主要要改进这些方面:

  • 使用
  • 使用
  • 使用
  • 这终于对我起了作用:

    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上面和下面评论的启发。谢谢大家!

    必须使用F()表达式而不是timestamp2
    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()
        )
    )