【发布时间】:2018-10-21 04:16:01
【问题描述】:
我有一张桌子,上面有一组 Orders 我的客户制作的(购买,可以这么说)。
客户可以选择交货日期。该值存储在每个 Order 中的一个名为 Order.delivery_date 的字段中(没有太多创意)
class Order(BaseModel):
customer = ForeignKey(Customer, on_delete=CASCADE, related_name='orders')
delivery_date = DateField(null=True, blank=True)
我想用上一个星期日为该delivery_date 获取Orders 的查询集添加注释(主要是为了创建每周报告,每周“分桶”)
我想 “哦!我知道了!我会得到一周中的日期索引,然后我会用该周索引的天数减去 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 表达式。
在Extract 中不使用F 函数也没有什么区别:无论我使用Extract(F('delivery_date')) 还是Extract('delivery_date'),我都会遇到同样的错误
这是 Python 3.4,Django 2.0.3 优于 MySQL 5.7.21
我知道我总是可以获取 Order 对象并在 Python 中执行此操作(我什至有一个小辅助函数可以执行此操作)但最好从数据库中获取带有该注释的对象(也用于学习目的)
提前谢谢你。
【问题讨论】:
-
我已经回答了我自己的问题,但如果有人有更好的建议,请随时回答。 ???我什至不太确定我的答案是可以做到的最好的,而且它肯定是非常特定于数据库的。如果有人有更便携(如果可能的话,更“基于 Django”)的解决方案,请发布它????
标签: python mysql django datetime django-queryset