2016-12-16 48 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