как использовать __year и __in в одном запросе? - PullRequest
5 голосов
/ 22 июня 2011

Итак, вот что я пытаюсь сделать.
У меня есть список с годами, например years = [2002, 2003, 2004]
и у меня SomethingModel с DateField

Я хочу сделать запрос, который вернет мне все объекты, принадлежащие этому году:

Я знал эту работу:

 SomethingModel.objects.filter(date__year=2003) 
 SomethingModel.objects.filter(date__in=[list with dates])

Итак, я попробовал это:

SomethingModel.objects.filter(date__year__in=years)

но это возвращает мне эту ошибку:

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

У кого-нибудь есть идеи, как это сделать? Прямой путь ..

Спасибо!

Ответы [ 4 ]

6 голосов
/ 22 июня 2011

Вы не можете, если вы посмотрите на документацию набора запросов

Entry.objects.filter(pub_date__year=2005)

становится эквивалентом SQL:

SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31 23:59:59.999999';

Таким образом, вы не можете смешивать __in и __date концептуально. В любом случае вы не можете смешивать суффиксы, поскольку первый «суффикс» будет интерпретироваться как несуществующее отношение.

Вам нужно будет использовать фильтр меньше, чем фильтр, и больше, или, если список не является смежным, дополнительное поле where, что-то вроде:

SomethingModel.objects.extra(where=["YEAR(date) IN (" + ",".join([str(x) for x in [2003, 2008, 2010]]) + ")"])
0 голосов
/ 17 апреля 2014

Вы можете использовать: SomethingModel.objects.filter (date__range = (date_1, date_2)

0 голосов
/ 24 июня 2011

Если ваш список лет всегда последовательный, вы можете сделать

SomethingModel.objects.filter(date__year__gte=years[0], date__year__lte=years[-1])
0 голосов
/ 22 июня 2011

Можно попробовать,

SomethingModel.objects.filter(date__year=[year for year in years])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...