另一种优雅的方法是创建数据库函数。
假设我们有以下描述的模型。我们的目标是过滤掉所有在现在之前结束的对象。
from django.db import models
class SomeModel(models.Model):
date_start = models.DateTimeField()
duration = models.FloatField()
数据库功能实现:
from django.db.models.expressions import Func
from django.db.models import DateTimeField
class Interval(Func):
function = 'INTERVAL'
template = "(%(expressions)s * %(function)s '1 %(phylum)s')"
def __init__(self, expression, phylum, **extra):
output_field = extra.pop('output_field', DateTimeField())
super(Interval, self).__init__(expression, output_field=output_field, phylum=phylum, **extra)
使用Interval函数时,第一个参数可以是F(“field_name”)或Value()或某些Python对象。作为第二个参数,它可以是:'second','minute','hour','day'。
objs = (SomeModel.objects.annotate(date_end=F('date_start') + Interval(F('duration'), 'hour')).
filter(date_end__lte=datetime.datetime.now(pytz.utc)))
filter
方法基本上形成了一个要在数据库上执行的SQL
查询。因此,答案是您不能在数据库表中不存在的字段上使用查找。 - Dmitry Yantsen