1

我觉得这与我之前提出的问题有关,但这里是:

我正在使用 Django 的查询集,并且有一些我正在处理的日期。现在在我的代码中,我正在使用extra调用来尝试从日期中提取年份和月份:

sum_qs = sum_qs.extra(select={'year': 'EXTRACT(year FROM date)', 'month': 'EXTRACT(month FROM date)','is_paid':'date_paid IS NOT NULL'})

sum_qs = sum_qs.values('client__name', 'subtotal_currency', 'is_paid','year', 'month')

但是,我正在尝试摆脱对 的调用extra,因为考虑到 django 对日期进行了多年和数月的字段查找,这似乎有点无用。

因此,我尝试执行以下操作:

sum_qs = sum_qs.values('client__name', 'subtotal_currency', 'is_paid','date__year', 'date__month')

但是在这里我遇到了一个奇怪的错误:

Join on field 'date' not permitted. Did you misspell 'year' for the lookup type?

首先,我无法真正理解这个错误的含义。而且,我真的不可能以这种方式度过这一年吗?我主要想这样做,因为稍后annotate我的查询使用了一个总和,该总和基于年份和月份。

4

2 回答 2

1

https://docs.djangoproject.com/en/dev/ref/models/querysets/#values

我认为您仍然需要使用额外的查询。

字段查找

字段查找是您指定 SQL WHERE 子句内容的方式。它们被指定为 QuerySet 方法filter()、exclude() 和 get()的关键字参数。

当您在值查询中使用双下划线时,Django 认为您正在尝试在关系字段“日期”上查找字段。

于 2013-08-19T04:32:43.847 回答
1

values用于限制 SELECT 语句并将值直接映射到 db 字段名称。Django 允许您date__year=2000用作filter()调用的魔法不适用于values().

最好的答案实际上取决于您的需求/如果您需要查询集或值..但大多数人values()用作接收少量键的字典映射的快捷方式。

这是一个正常工作的捷径!如果没有,请毫不犹豫地找到任何方法使数据正常工作并继续前进..

[{'date__year': x.date.year, 'foo': 'bar'} for x in sum_qs.values('date', 'foo')]
于 2013-08-19T05:27:08.487 回答