我正在尝试编写一个基于特定日期过滤的查询。假设我在db
中有三个数据target_date = 28th of october
today = 23rd of october
data one
publish_date = 26th of october
data two
publish_date = 24th of october
data three
publish_date = target_date # 28th of october
我的查询需要获取目标日期前三天或更短时间的所有数据。由于目标日期是10月28日,因此应该提取第26,27和28(目标日期)范围内的任何数据。
查询
MyModel.objects.filter(
publish_date__range=[F('publish_date'), F('publish_date') - timedelta(days=3)]
)
target_date因行数据而异。 我得到了意想不到的结果。
答案 0 :(得分:0)
首先:“我得到了意想不到的结果。”理解你的问题的坏方法
第二:任何方式你都会在过滤器中遇到问题,因为你在最大日期之后添加了最小日期。
第三:你的sql中的where子句如下:
WHERE "publish_date" BETWEEN F(publish_date) AND F(publish_date) - DurationValue(3 days, 0:00:00)
它适用于每一行,因此您将获得空查询集
最后,我可以看到你可以尝试简单的方法:
target_date = MyModel.objects.filter(HERE_YOUR_RULE).first().publish_date
from_date = target_date - timedelta(days=3)
MyModel.objects.filter(publish_date__range=[from_date, target_date])
不要忘记更改HERE_YOUR_RULE
,希望有所帮助。
答案 1 :(得分:0)
试试这个过滤器:
reference_date = MyModel.objects \
.filter(user=some_user_receiving_email) \
.order_by('-is_published')[0].is_published
queryset_to_include_in_email = MyModel.objects.filter(
publish_date__gte=reference_date - timedelta(days=3),
publish_date__lte=reference_date
)
答案 2 :(得分:0)
MyModel.objects.
filter(publish_date__range=
[F('publish_date'), F('publish_date') + timedelta(days=3)])
将获取发布日期与发布日期后三天范围内的published_date的所有对象。