2017-08-15 151 views
0

嗨,我有一些Django的11項目中,我的模型看起來像Django的視圖對象與timezone.now過濾器()。日期或timezone.now()。時間>期望的字符串或字節狀物體

class Event(models.Model): 
    name = models.CharField(max_length=100, unique=True) 
    title = models.CharField(max_length=100) 
    info = models.CharField(max_length=100) 
    image = models.ImageField(upload_to='events/%Y/%m/%d') 
    start_date = models.DateField(default=timezone.now) 
    start_time = models.TimeField(default=timezone.now) 
    stop_date = models.DateField(default=timezone.now) 
    stop_time = models.TimeField(default=timezone.now) 

    place = models.ForeignKey('places.Place', on_delete=models.CASCADE) 
    company = models.ForeignKey('companies.Company', on_delete=models.CASCADE) 

和我的觀點看起來像

def place_website(request, place_id): 

    place_template = get_template('room.html') 

    place_obj = Place.objects.filter(id=place_id) 

    # filter for event obejts only for requested place, filtered for now and next events 
    place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date) 

    place_events_next = Event.objects.filter(place=place_id, start_date=timezone.now(), stop_date__gte=timezone.now()).order_by('start_time') 

    place_context = { 
     'place_obj': place_obj, 
     'place_event_now': place_event_now, 
     'place_events_next': place_events_next, 
    } 

    return HttpResponse(place_template.render(place_context)) 

我要管理的事情是要傳遞給模板,根據時間過濾事件對象的列表。

讓我們選擇這行

place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date) 

它職高錯誤「預期字符串或字節狀物體」,但是當我刪除「.date」‘timezone.now()’錯誤消失(然後過濾無能爲力),但我想比較日期和時間。

如何正確執行此操作?

這種在視圖中而不是在模板中過濾對象的方法是正確的嗎?

###### UPDATE ########

其因修正後werid現在我沒有錯誤,但查詢集沒有正確過濾,看起來就像只有兩個第一個參數是過濾好吧,另外兩個導致空的查詢集。

place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().strftime('%Y-%m-%d'), start_time__lte=timezone.now().strftime('%H:%M:%S'), stop_time__gte=timezone.now().strftime('%H:%M:%S')) 

我我的數據庫時,保存在格式H:M:S。和timezone.now()時間()有不同的格式,所以我修改濾波器.strftime這沒有幫助,我什麼將不會將「place_event_now」queryset設置爲滿足條件的特定對象/對象start_time < currenttime < stop_time。

另一種情況是用place_event_next

place_events_next = Event.objects.filter(place=place_id, start_date=timezone.now().strftime('%Y-%m-%d'), stop_date__gte=timezone.now().strftime('%Y-%m-%d'), start_time__gt=timezone.now().strftime('%H:%M:%S')).order_by('start_time') 

事件時篩選對象START_TIME大於timezone.now()它們仍然是在查詢集。

我做錯了什麼?

+0

您錯過了括號'.date()' –

+0

https://docs.djangoproject.com/en/1。11 /話題/國際時區/ – Alexander

+0

@SébastienDrezrez傢伙這就是它!非常感謝 !!! –

回答

0

可能是你需要調用datedate() 取代

filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date) 
#             ^^^         ^^^ 

filter(place=place_id, start_date=timezone.now().date(), stop_date__gte=timezone.now().date()) 
#             ^^^         ^^^ 
+0

可能是你需要'start_date__gte ='而不是'start_date ='add __gte –

+0

我想限制查詢集今天的事件,所以我認爲它應該是start_date沒有__gte?對 ? –

+0

它可以幫助你'start_date__date'嗎? –

0

我想通了這timezone.now()返回時間不是在我目前的時區,我更改爲timezone.localtime()和一切工作完美!

相關問題