比较两个字段的 Django 过滤器

5 投票
1 回答
1666 浏览
提问于 2025-04-18 07:43

我该怎么在Django查询中比较两个字段呢?

简单来说,我想把任务分成两类:延迟的和按时的。

一个任务被认为是延迟的,当今天的日期和请求日期之间的差值超过了允许的天数。

现在我有了这个:

def dayssince(value):
    if value is None:
        return '0'
    #"Returns number of days between today and value."
    today = datetime.date.today()
    diff  = today - value
    if diff.days > 1:
        return '%s' % diff.days
    elif diff.days == 1:
        return '1'
    elif diff.days == 0:
        return '0'
    else:
        # Date is in the future; return formatted date.
        return value.strftime("%B %d, %Y")


on_time = process.(Department__Tolerance__gte=dayssince(F('Request_date'))).annotate(Counter=Count('Client'))
delayed = process.(Department__Tolerance__lte=dayssince(F('Request_date'))).annotate(Counter=Count('Client'))

但是我遇到了一个属性错误:

'ExpressionNode'对象没有'days'这个属性

1 个回答

0

F 表达式在 Python 中并不会返回可以使用的值,所以你的函数是在一个 SQL 表达式上被调用的,这就是出错的原因。F 表达式主要用来封装 数据库 操作。Python 根本看不到字段的值。

你可以在 F 表达式中使用许多其他操作:支持的 F 操作。特别是,你可以使用 Python 的 timedelta 对象来比较日期;具体可以查看 过滤器中的 F 表达式

撰写回答