Django中,query_set注释带有条件表达式



我有一个模型:

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()

在数据库中不需要这样做。把它放到一个模型方法中:

class Document(models.Model):
    expiry_date = models.DateField()
    def expired(self):
        return self.expiry_date < timezone.now.date()

可以使用条件注释

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')

这适用于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

相关内容

  • 没有找到相关文章

最新更新