我觉得这与我问的previous question有关,但这里有:
我正在使用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
我的查询总结了基于年和月的总和。
答案 0 :(得分:1)
https://docs.djangoproject.com/en/dev/ref/models/querysets/#values
我认为你仍然需要使用额外的查询。
字段查找
字段查找是指定SQL的内容的方式 WHERE子句。它们被指定为QuerySet的关键字参数 方法 filter(),exclude()和get()。
Django认为当你在你的值查询中使用双下划线时,你试图在关系字段“date”上查找一个字段。
答案 1 :(得分:1)
values
用于限制SELECT语句,并将值直接映射到db字段名称。允许您将date__year=2000
用作filter()
来电的Django巫术不适用于values()
。
最佳答案实际上取决于您的需求/如果您需要一个或多个查询集..但大多数人使用values()
作为快捷方式来接收少量键的字典映射。
这是通常有效的捷径!如果没有,请不要犹豫,找到任何方法使数据工作并继续前进..
[{'date__year': x.date.year, 'foo': 'bar'} for x in sum_qs.values('date', 'foo')]