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

时间:2011-12-07 11:31:06

标签: 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?

然后我试了

 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')

我在querset结果中需要它,因为我在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 个答案:

答案 0 :(得分:2)

在Django 1.10+中,您可以使用ExtractMonth函数。

from django.db.models.functions import ExtractMonth
OrderItem.objects.all().annotate(order_month=ExtractMonth('order__payment_date'))

答案 1 :(得分:1)

你需要下载到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)"