2012-06-28 20 views
12

Aşağıdakileri bir Django filtresinde mantıksal olarak temsil etmek için uğraşıyorum. Bugün meydana gelen tüm olayları seçmek istediğiniz belirli bir yerde içinBugün gerçekleşen Django filtre olayları

class Location(models.Model): 
    name = models.CharField(max_length=255) 

class Event(models.Model): 
    start_date = models.DateTimeField() 
    end_date = models.DateTimeField() 
    location = models.ForeignKeyField(Location) 

    objects = EventManager() 

: Ben bir 'olay' modelini ve olarak temsil edilebilir bir konum modeli var. Ben Eventmanager bir 'bookings_today' yöntemiyle çeşitli stratejiler denedim ama sağ filtre sözdizimi bana eludes: Bu kez sıfırlar olarak başarısız

class EventManager(models.Manager): 
    def bookings_today(self, location_id): 
     bookings = self.filter(location=location_id, start=?, end=?) 

tarihi(), ve gün boyunca zaman için kritik Bu uygulama, aynı tarih ve en fazla tarihler için geçerlidir ve bunları kitap ayracı olarak kullanır. Buna ek olarak, birden çok olası geçerli konfigürasyon vardır:

start_date < today, end_date during today 
start_date during today, end_date during today 
start_date during today, end_date after today 

Ben farklı seçenekler bütün seti kod gerek veya daha basit ve zarif bir yöntem yoktur musunuz?

+1

sql @danielroseman tarafından bu yanıt ayrıca bkz ARASINDAKİ için aralık operatörü de bakabilirsiniz: http://stackoverflow.com/questions/3963201/ iki tarih arasında django ile nasıl bir seçim yaparsınız –

cevap

19

İki ayrı datetime eşikleri gerekir - today_start ve today_end:

şey bugün gerçekleşiyor today_end önce başlamış olmalı ve yüzden, today_start sonra sona eren
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()) 

:

class EventManager(models.Manager): 
    def bookings_today(self, location_id): 
     # Construction of today_end/today_start as above, omitted for brevity 
     return self.filter(location=location_id, start__lte=today_end, end__gte=today_start) 

(P.S. Bir DateTimeField (bir DateField) foo_date denilen olması irritatingly yanıltıcı - gördüm cevapların

+0

Aha - harika! Teşekkürler. – jvc26

+1

'datetime.now()' lütfen – lajarre

1

Buna ne dersin: pub_date__gte=datetime(2005, 1, 1)? Zincirleme yöntemini kullanarak bir gün içinde başlangıcı ve bitişi sınırlamak için _gte ve __lte kullanın.

Belki de self.filter(start__gte=datetime(2005, 1, 1)).filter(end__lte=datetime(2005, 1, 1)) gibi bir şey. lte, daha büyük veya eşittir. gte, büyük veya eşittir.

django doc içinde buluyorum.

5

Böyle Orada bir dizi kullanmak gerekir:

class EventManager(models.Manager): 
    def bookings_today(self, location_id): 
     from datetime import datetime 
     now = datetime.now() 
     bookings = self.filter(location=location_id, start__lte=now, end__gte=now) 
     return bookings 
+0

Etkinliğin başlangıcı ve bitişi bugün içinde olursa ne olur? Bu onu almayacaktı - bu bir * headdesk * anı olabilir, ama bugün end__gte = koyup start__lte = bugün çözer mi? – jvc26

+0

Evet, haklısınız. end__gte = bugün ve start__lte = bugün kullanılmalıdır. –

+0

Doğru, bu, başlangıç ​​tarihi, bugünün başlangıcından önce veya ondan sonra düşebileceğinden ve date.today() datetime nesnelerini, seçim sırasında eşitlik açısından gözükmüyor gibi görünmüyor. – jvc26

0

Ben senin arkadaşın burada dışlamak düşünüyorum!

today = datetime.date.today() 
tomorrow = today + datetime.timedelta(days = 1) 
self.filter(location = location_id).exclude(end_date__lt = today).exclude(start_date__gte = tomorrow) 
1

Yok saat dilimi farkındadır) ... sadece start ve end düşünün.

Neden sadece yerine bunu yapmayın:

from django.utils import timezone 

class EventManager(models.Manager): 
    def bookings_today(self, location_id): 
     bookings = self.filter(location=location_id, start__gte=timezone.now().replace(hour=0, minute=0, second=0), end__lte=timezone.now().replace(hour=23, minute=59, second=59)) 
İlgili konular