2014-12-06 201 views
2

我在使用基於DateTimeField的過濾器來使用django queryset API引用。django queryset篩選日期時間域

我已經準備了下面的模型,在我的models.py:

class KleedkamerIndeling(models.Model): 

gametimedate = models.DateTimeField(auto_now=False, auto_now_add=False) # date and time of game 
hometeam = models.CharField(max_length=25, blank=True)      # name of home playing team team 
homedressroom = models.CharField(max_length=25, blank=True)    # dressing room of home playing team 
awayteam = models.CharField(max_length=25, blank=True)      # name of visiting team team 
awaydressroom = models.CharField(max_length=25, blank=True)    # dressing room of visiting team team 
pitch = models.CharField(max_length=25, blank=True)      # name/number of playing pitch 
referee = models.CharField(max_length=25, blank=True)      # name of referee 
refdressroom = models.CharField(max_length=25, blank=True)     # name/number of referee dressroom 
timestamp = models.DateField(auto_now_add=True, auto_now=False) 
indelings_datum = models.DateField() # need to change to datum added later 

def __unicode__(self): 
    return smart_unicode(self.hometeam) 

我想基於本日訪問數據庫。應該是這樣的:

queryset = KleedkamerIndeling.objects.all().filter(gametimedate=date.today()) 

當我用「的DateField」,但我決定去一個DateTimeField字段,因爲我還需要比賽的開始時間播放之前這個工作。

我已經找到了網頁和計算器,發現了以下舊主題How can I filter a date of a DateTimeField in Django?,但是我在實施中遇到了一些問題。

我想創建一個查詢集,以獲取當今日期可用的所有'KleedkamerIndeling'。隨後我想檢查列表中是否有多個對象。如果是這種情況,我想根據當前時間進一步縮小範圍,也可以通過datetimefield上的過濾器進行縮小。最後,我想對對象列表進行排序,以便按時排序。

我知道我的問題必須做到這一點datetimefield麪包車的特性我欣賞一些代碼行,以幫助我前進。我一直試圖在python manage.py shell中查找正確的查詢,整個下午......

我的模型大部分工作是因爲queryset = KleedkamerIndeling.objects.all()似乎工作,我可以設置爲查詢集列表中的每個對象(稱爲'game0到game10')提供單獨的列表。

我對DateTimeField字段格式的另一個問題:

我已經定義了一個「KleedkamerIndeling」描述一個遊戲,開始時間爲13:00。我已經使用查詢集列表中的對象來定義10個不同的'遊戲'對象。即game0 = [queryset [0] .hometeam等...儘管game10(如果適用)。遊戲時間字段通過如下過濾器顯示在模板中:{{game0.0 | date:「H」}}:{{game0.0 | date:「i」}}。在沒有game0對象的情況下,我仍然以':'結尾。我打算通過模板或視圖中的if else腳本來解決這個問題,還是有更好的方法來解決這個問題?

回答

1

由於您使用的是日期時間字段,您希望使用日期時間對象進行查詢。所以首先從最早到最新排列查詢集,然後過濾掉今天不會發生的事件。

from datetime import datetime, timedelta, time 

today = datetime.now().date() 
tomorrow = today + timedelta(1) 
today_start = datetime.combine(today, time()) 
today_end = datetime.combine(tomorrow, time()) 

queryset = KleedkamerIndeling.objects.order_by('-gametimedate').filter(gametimedate__gte=today_start).filter(gametimedate__lt=today_end) 

之後,我們可以檢查是否有超過10點的對象,由當前的時間過濾,並限制查詢集到10個對象。

if queryset.count() > 10: 
    queryset = KleedkamerIndeling.objects.filter(gametimedate__gte=datetime.now())[:10] 
+0

太棒了,這似乎工作。謝謝!在python shell中嘗試使用時收到和運行時間預熱。它表示'RuntimeWarning:DateTimeFiled KleedkamerIndeling.gametimedate收到了一個天真的日期時間(2014-12-06 00:00:00),而時區支持處於活動狀態「。但除此之外,它的作品! – borreltijd 2014-12-06 19:09:04

+0

時區可能會很棘手我建議通過一些djangos文檔閱讀https://docs.djangoproject.com/en/1.7/topics/i18n/timezones/#naive-and-aware-datetime-objects – Tim 2014-12-06 19:38:36