Python 基于第'行,用上一个星期日注释Django queryset;s日期字段

Python 基于第'行,用上一个星期日注释Django queryset;s日期字段,python,mysql,django,datetime,django-queryset,Python,Mysql,Django,Datetime,Django Queryset,我有一张桌子,上面有一套客户(可以这么说是购买的)下的订单 客户可以选择交货日期。该值存储在每个订单中一个名为订单.交货日期的字段中(没有太多创造性) 我想对一个查询集进行注释,该查询集在前一个周日获取该交货日期的订单(主要用于每周创建一份“bucketized”周报) 我想“哦!我知道!我将得到一周中的日期索引,然后用该周索引的天数减去一个datetime.timedelta,然后用它来得到星期日(如Python的.weekday()函数): 但是如果我这样做,我会在尝试“构造”timedel

我有一张桌子,上面有一套客户(可以这么说是购买的)下的
订单

客户可以选择交货日期。该值存储在每个
订单
中一个名为
订单.交货日期
的字段中(没有太多创造性)

我想对一个查询集进行注释,该查询集在前一个周日获取该
交货日期的
订单
(主要用于每周创建一份“bucketized”周报)

我想“哦!我知道!我将得到一周中的日期索引,然后用该周索引的天数减去一个
datetime.timedelta
,然后用它来得到星期日(如Python的.weekday()函数):

但是如果我这样做,我会在尝试“构造”
timedelta
表达式时得到一个
TypeError:timedelta-days组件不支持的类型:CombinedExpression

不使用
Extract
中的
F
功能也没有什么区别:无论我是使用
Extract(F('delivery_日期'))
还是
Extract('delivery_日期')

这是一个Python3.4,Django 2.0.3优于MySQL 5.7.21

我知道我总是可以获取
Order
对象,并用Python来实现(我甚至有一个小的helper函数可以实现这一点),但是从DB中获取带有注释的对象(也用于学习目的)会很好


提前谢谢你。

哦,我忘了

看起来应该这样做(至少对于MySQL是这样)

这似乎有效:

for record in orders_q.values('sunday', 'delivery_date'):
    print("date: {delivery_date}, sunday: {sunday} is_sunday?: {is_sunday}".format(
        is_sunday=record['sunday'].weekday() == 6, **record)
    )

EDIT:显然,
extra
正在被弃用/不受支持。至少,不是很。。。嗯。。。由Django开发人员编写。也许改用它会更好。事实上,我在尝试使用
extra
sunday
注释中进行进一步过滤时遇到了问题,而我没有使用
RawSQL
方法

这似乎效果更好:

orders_q = orders_q.annotate(
    sunday=RawSQL("DATE_ADD(`delivery_date`, interval(1 - DAYOFWEEK(`delivery_date`)) DAY)", ())
)
这让我可以进一步解释

orders_q.annotate(sunday_count=Count('sunday'))

我不知道为什么,但当我使用
extra
时,我会发现
无法将关键字“sunday”解析到字段中

我已经回答了我自己的问题,但如果有人有更好的建议,请随时回答。
for record in orders_q.values('sunday', 'delivery_date'):
    print("date: {delivery_date}, sunday: {sunday} is_sunday?: {is_sunday}".format(
        is_sunday=record['sunday'].weekday() == 6, **record)
    )
date: 2018-06-04, sunday: 2018-06-03 is_sunday?: True
date: 2018-05-30, sunday: 2018-05-27 is_sunday?: True
date: 2018-05-21, sunday: 2018-05-20 is_sunday?: True
date: 2018-06-04, sunday: 2018-06-03 is_sunday?: True
orders_q = orders_q.annotate(
    sunday=RawSQL("DATE_ADD(`delivery_date`, interval(1 - DAYOFWEEK(`delivery_date`)) DAY)", ())
)
orders_q.annotate(sunday_count=Count('sunday'))