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