Djagno,带有条件表达式的query_set注释

时间:2015-07-11 19:01:17

标签: django django-queryset

我有一个模特:

class Document(models.Model):
    expiry_date = models.DateField()

如何构建一个查询,该查询获取所有文档并给出注释是否已过期? 我试过这个:

today = timezone.now.date()

Document.objects.annotate(
    expired=Value(
        F('expiry_date')<today, 
        BooleanField()
    )
)

但它引发了一个错误:TypeError: unorderable types: F() < datetime.date() 如何将F()表达式的值与日期进行比较?

另外,我想避免使用SQL和.extra()

3 个答案:

答案 0 :(得分:2)

在数据库中没有必要这样做。把它放在模型方法中:

class Document(models.Model):
    expiry_date = models.DateField()

    def expired(self):
        return self.expiry_date < timezone.now.date()

答案 1 :(得分:0)

您可以使用条件注释。

使用Django 1.11.10进行测试。

from django.db.models import BooleanField, Case, When  
from django.utils import timezone

Document.objects.annotate(
    expired=Case(
        When(expiry_date__lt=timezone.now(), then=True),
        default=False,
        output_field=BooleanField()
    )
).order_by('expired')

答案 2 :(得分:0)

这适用于Django> = 2,没有检查以前的版本

from django.db import models
from django.db.models import ExpressionWrapper, Q
from django.db.models.functions import Now

Document.objects.annotate(
    expired=ExpressionWrapper(Q(expiry_date__lt=Now()),
    output_field=models.BooleanField())
)

来源: https://stackoverflow.com/a/57114224/11193405