我想在查询集中包含月份编号,其中日期位于相关模型中。这就是我试过的:
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}
答案 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)"