我有一张table和一套餐具 Orders
我的顾客做的。
客户可以选择交货日期。该值存储在每个 Order
在一个叫做 Order.delivery_date
(没有太多创造性)
class Order(BaseModel):
customer = ForeignKey(Customer, on_delete=CASCADE, related_name='orders')
delivery_date = DateField(null=True, blank=True)
我想注解一个查询集 Orders
和上个星期天一样 delivery_date
(主要是创建周报,每周“bucketized”)
我想“哦!我知道!我将得到本周的日期索引,然后减去a datetime.timedelta
使用该周的天数索引,我将使用它来获取星期日(如python的.weekday()函数)“:
from server.models import *
import datetime
from django.db.models import F, DateField, ExpressionWrapper
from django.db.models.functions import ExtractWeekDay
Order.objects.filter(
delivery_date__isnull=False
).annotate(
sunday=ExpressionWrapper(
F('delivery_date') - datetime.timedelta(days=ExtractWeekDay(F('delivery_date')) + 1),
output_field=DateField()
)
).last().sunday
但如果我这么做,我会得到一个 TypeError: unsupported type for timedelta days component: CombinedExpression
当尝试“构造”时: timedelta
表情。
不使用 F
在 Extract
也没有什么区别:不管我是否使用 Extract(F('delivery_date'))
或者 Extract('delivery_date')
这是一个python3.4版本,在mysql 5.7.21上使用了django 2.0.3
我知道我总是能拿到钱 Order
对象并在python中执行此操作(我甚至有一个小的helper函数可以执行此操作),但是从db中获取带有该注解的对象(也用于学习目的)会很好
先谢谢你。
1条答案
按热度按时间bvk5enib1#
哦,我忘了
extra
看起来应该这样做(至少对mysql是这样)似乎有用:
编辑:显然,
extra
即将被否决/不支持。至少,不是很。。。呃。。。深受django开发商的欢迎。也许用这个更好RawSQL
相反。实际上,我在尝试进一步过滤时遇到了问题sunday
注解使用extra
但我不明白RawSQL
方法。。这似乎效果更好:
这让我可以进一步解释。。。
我不知道为什么,但是当我使用
extra
,我会得到Cannot resolve keyword 'sunday' into field