时间字段+天数字段=计算后时间
调用数据库DATE_ADD构建ORM可使用的公共方法
class DateAdd(Func): function = 'DATE_ADD' def __init__(self, expression, bufferday=1, **extra): self.template = '%(function)s(%(expressions)s, INTERVAL {} DAY)'.format(bufferday) super(DateAdd, self).__init__(expression, **extra) 上面方法不可行使用下面的方法 class DateAdd(Func): """ 自定义 DATE_ADD 函数,用法: DateAdd(expression, bufferday) - expression: 日期字段或表达式 - bufferday: 要增加的天数,可以是整数常量或 F('相关字段') """ function = 'DATE_ADD' def __init__(self, expression, bufferday=1, **extra): # 将日期表达式和天数表达式都作为位置参数传入 expressions = [expression, bufferday] super(DateAdd, self).__init__(*expressions, **extra) def as_sql(self, compiler, connection, function=None, template=None): # 编译两个子表达式 sqls, params = [], [] for expr in self.source_expressions: sql, param = compiler.compile(expr) sqls.append(sql) params.extend(param) # 使用函数名(允许自定义)构建最终 SQL function = function or self.function sql = "{}({}, INTERVAL {} DAY)".format(function, sqls[0], sqls[1]) return sql, params如何在orm中使用公共方法
obj_query = Model.objects.annotate( DueDate=DateAdd( F('Date'), F('days'), output_field=DateField() ) ).values('DueDate')