为什么我不能在值调用中使用Django的字段查找?

时间:2013-08-19 04:03:21

标签: django django-queryset

我觉得这与我问的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我的查询总结了基于年和月的总和。

2 个答案:

答案 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')]