我有一个模特:
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()
答案 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())
)