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