我有一个模型:
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