2016-12-16 51 views
0

即时通讯有问题,使用DjangoORM查询所需的结果,我的数据库。正确做出BETWEEN子句

这是我的模型。

class HeatWatchList(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, 
        related_name='watchlist_users', on_delete=models.CASCADE) 

    heat = models.OneToOneField(Heat, related_name='heat_watch_list', 
        on_delete=models.CASCADE) 

    next_date_from = models.DateTimeField() 
    next_date_to = models.DateTimeField() 

我想获得的所有记录下今天的日期之间next_date_fromnext_date_to领域。

,我可以很容易地做到这一点原始的SQL:

SELECT 
    * 
FROM 
    farm_management_db.heat_heatwatchlist 
WHERE 
    DATE(now()) BETWEEN DATE(next_date_from) AND DATE(next_date_to); 

这是我试过到目前为止,但我没有得到任何记录:

HeatWatchList.objects.filter(
       next_date_from__date__gte=datetime.now().date(), 
       next_date_to__date__lte=datetime.now().date() 
      )  
+1

日期时间.now()不是2017-01-23 – e4c5

+0

对不起,它是'now()' –

+0

这个修改过的原始查询产生了什么sults? – e4c5

回答

2

你应该试试下面的代码,而不是(删除__date):

HeatWatchList.objects.filter(
       next_date_from__gte=datetime.now().date(), 
       next_date_to__lte='2017-01-23' 
      ) 
+0

这一部分解决了它,但我有一个model.DateTimeField所以当我查询我想排除时间。 –

+0

它应该是next_date_from_lte和next_date_to__gte才能正常工作,但是查询包含时间。 –

+0

针对此变通,就是用Dajngo的DateField代替DateTimeField字段,或者,你可以构造比较值作为DateTimeField字段与“T00:00:00' 和‘23:59:59’ – shady

0

你可以添加一个功能到你的模型。

def is_between_date(self): if Timezone.zone() > next_date_from and timezone.zone() < next_date_to: return True return False

1

你可以这样做(通过去除__date),并使用datetime.combine

from datetime import datetime, time 

HeatWatchList.objects.filter(
       next_date_from__gte=datetime.combine(datetime.now().date(), time.min), 
       next_date_to__lte=datetime.combine(datetime.now().date(), time.max) 
      ) 
+0

这是一样的黑幕答案 –

+0

它是随时间变化的 – itzMEonTV