使用__range和F进行Django查询

时间:2017-10-20 09:52:22

标签: python django postgresql

我正在尝试编写一个基于特定日期过滤的查询。假设我在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因行数据而异。 我得到了意想不到的结果。

3 个答案:

答案 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的所有对象。