如何在 Django 查询集中获取日期的月份

Pho*_*beB 2 django django-queryset

我想在查询集中包含一个月份数字,其中日期在相关模型中。这是我尝试过的:

 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?
Run Code Online (Sandbox Code Playgroud)

然后我试过了

 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'")
Run Code Online (Sandbox Code Playgroud)

但这有效,因此 order.payment_date 没有问题

 OrderItem.objects.all().values('id','order__payment_date').select_related('Order')
Run Code Online (Sandbox Code Playgroud)

我在查询集结果中需要它,因为我在 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}
Run Code Online (Sandbox Code Playgroud)

Bob*_*ort 7

在 Django 1.10+ 中,您可以使用该ExtractMonth功能。

from django.db.models.functions import ExtractMonth
OrderItem.objects.all().annotate(order_month=ExtractMonth('order__payment_date'))
Run Code Online (Sandbox Code Playgroud)