Как получить месяц даты в наборе запросов Django - PullRequest
0 голосов
/ 07 декабря 2011

Я хочу включить номер месяца в набор запросов, где дата находится в связанной модели. Вот что я попробовал:

 OrderItem.objects.all().annotate(order_month=Sum('order__payment_date__month'))[0].__dict__

 Join on field 'payment_date' not permitted. Did you misspell 'month' for the lookup type?

а потом я попробовал

 OrderItem.objects.all().extra(select={'order_month': "order__payment_date__month"})

 (1054, "Unknown column 'order__payment_date__month' in 'field list'")

 OrderItem.objects.all().extra(select={'order_month': "order.payment_date"}).select_related('Order')

 (1054, "Unknown column 'order.payment_date' in 'field list'")

Но это работает, поэтому нет проблем с order.payment_date

 OrderItem.objects.all().values('id','order__payment_date').select_related('Order')

Мне нужно это в результате выполнения набора запросов, так как я использую набор запросов в Geraldo. Кто-нибудь знает, как я могу получить это?

ОТВЕТ состоял в том, что в дополнительном разделе вам нужно указать, что вы хотите, чтобы MySQL это понимал. В моем случае добавление приложения перед названием модели. В этом случае web_order.payment_date. Это сработало:

OrderItem.objects.all().extra(select={'order_month': "MONTH(web_order.payment_date)"}).select_related('order')[0].__dict__

{'product_id': None, 'order_id': 1L, 'price': Decimal("1.00"),  'order_month': 7L, 'id': 1L}

Ответы [ 2 ]

2 голосов
/ 19 апреля 2017

В Django 1.10+ вы можете использовать функцию ExtractMonth.

from django.db.models.functions import ExtractMonth
OrderItem.objects.all().annotate(order_month=ExtractMonth('order__payment_date'))
1 голос
/ 07 декабря 2011

Вам нужно будет перейти в SQL, чтобы это сделать, что, к сожалению, означает, что решение не будет независимым от базы данных.

Это работает в Postgres:

# Grab the base queryset
items = Item.objects.all()

# Annotate
extra_query = "EXTRACT(MONTH FROM relatedtable.mydatefield)"
items = items.extra(select={'mydatefield_month': extra_query}

# We have to use a select_related so that 'relatedtable' is 
# available in the SQL statement.
items = items.select_related('relatedmodel')

print items[0].mydatefield_month

ДляMySQL вы можете попробовать:

extra_query = "MONTH(relatedtable.mydatefield)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...