2012-06-28 1 views
12

Djangoフィルタでは、論理的に次のように表現しています。私は「イベント」のモデルを持っている、とのように表すことができる場所のモデル、:指定した場所については今日のDjangoフィルタイベントが発生しました

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() 

は、私が今日発生したすべてのイベントを選択します。私はEventManagerの「bookings_today」メソッドを経由して様々な戦略を試してみたが、右フィルタの構文は、私を見逃さ:これは回をゼロとして

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

日付()は失敗し、日中の時間がために重要ですアプリは、同じものが日付の最小値と最大値になり、それらをブックエンドとして使用します。また、複数の可能な有効な構成があります。

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

私はさまざまなオプションのセット全体をコーディングする必要があるか、よりシンプルかつエレガントな方法はありますか?

+1

SQL BETWEENのための範囲演算子を見ては@danielrosemanでも、この答えを参照してください。http://stackoverflow.com/questions/3963201/どのように2つの日付を選択してください - djangoと –

答えて

19

次の2つの異なるdatetimeしきい値必要があります - today_starttoday_end:今日起こって何がtoday_endを開始している必要があります

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()) 

ので、today_startを終了:

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. DateTimeField(ないDateField)がfoo_dateと呼ば持つことは頭にくる誤解である - ちょうどstartendを検討...)私が見た回答の

+0

ああ - 華麗です!ありがとう。 – jvc26

+1

'datetime.now()'してください – lajarre

1

どうすればよいですか:pub_date__gte=datetime(2005, 1, 1)?連鎖方法を使用して1日以内に開始と終了を制限するには、_gte__lteを使用します。

多分self.filter(start__gte=datetime(2005, 1, 1)).filter(end__lte=datetime(2005, 1, 1))のようなものです。 lteは、gteよりも小さいか等しいことを表します。

django docにあります。

5

あなたはこのようにそこ範囲を使用する必要があります。

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

イベントの開始日と終了日が今日になるとどうなりますか?これはそれを選択しません - これはヘッドデスク*の瞬間かもしれませんが、end__gte = todayとstart__lte = todayはそれを解決するでしょうか? – jvc26

+0

はい、そうです。 end__gte = todayとstart__lte = todayを使用する必要があります。 –

+0

これは実際には機能しません。開始日が今日の開始日より前になるか、またはそれより後になる可能性があります。また、date.today()は、選択時の平等性に関してdatetimeオブジェクトと噛み合わないようです。 – jvc26

0

は、私はあなたの友人がここにある除外と思います!

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

なしタイムゾーンを認識しません。

なぜあなただ​​けの代わりにこれをしない:

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)) 
関連する問題