2016-06-28 68 views
1

假设我想有这样一个模型:查询新的Django的/的Postgres DateRangeField

from django.db import models 
from django.contrib.postgres.fields import DateRangeField 

class QueryRange(models.Model): 
    name = models.CharField('Name', max_length=50) 
    rsv = DateRangeField() 

而且在外壳我创建这样一些对象:

obj1 = QueryRange.objects.create(name='John', rsv=('2016-06-01', '2016-06-10')) 
obj2 = QueryRange.objects.create(name='Peter', rsv=('2016-07-05', '2016-07-10')) 
obj3 = QueryRange.objects.create(name='Chris', rsv=('2016-07-12', '2016-07-15')) 

我如何通过查询数据库问这个问题:请检查日期,即'2016-07-08'是否被占用

像这样的东西是行不通的:

from psycopg2.extras import DateRange 

rng = DateRange('2016-07-08') 
QueryRange.objects.filter(rsv__contains=rng) 

我有两个独立的date场(from_dateuntil_date)实现相同的场景和伟大工程(当然)。我只是好奇,我怎样才能让自己受益于DateRangefield

为所有的Djangonauts欢呼!

回答

2

你非常接近你的答案。当你正在寻找一个日期的情况下,直接使用日期对象:

from datetime import date 
QueryRange.objects.filter(rsv__contains=date.today()) 

如果您使用的日期范围查询,你可能想看看是否有任何重叠:

rng = DateRange('2016-07-08', '2016-07-20') 
QueryRange.objects.filter(rsv__overlap=rng) 

测试了两个示例以确保它们正常工作。

+0

谢谢你的回答。我会尽快尝试并在此处发布结果。 –

+0

这工作辉煌!但是当我搜索'QueryRange.objects.filter(rsv__contains = date(2016,6,10))'这是John的上限时,它什么也不给我。我知道默认情况下它被排除在外。我怎样才能包括它? (不是'DateRange',而是'date') –

+0

你的意思是如果你的数据库中的日期范围为'$ d1'到'$ d2'并且你过滤了'$ d2',你没有得到结果,因为它有'[)'边界?现在唯一的解决方案是搜索'$ d2 - timedelta(days = 1)'。我最近用django打开了一张票,让其他边界像'[]'实现,所以这不会发生。 – Anonymous