1

このモデルで

class Event(models.Model):
    name = models.CharField('Name', max_length = 200)

class EventSchedule(models.Model):
    event = models.ForeignKey(Event)
    active = models.BooleanField(default = False)
    sales_start = models.DateTimeField('Sales start')
    sales_finish = models.DateTimeField('Sales end')

少なくとも 1 つの EventSchedule がアクティブで、販売開始期間と販売終了期間内にあるすべての Events オブジェクトを効果的に取得するにはどうすればよいですか?

EventSchedule オブジェクトのフィルターは次のとおりです。

filter(active = True, sales_start__lte = now, sales_finish__gte = now)

しかし、EventSchedule オブジェクトの代わりに Event オブジェクトが必要ですか?

4

2 に答える 2

3

二重アンダースコア構文を使用して、リレーションをトラバースします。

Event.objects.filter(eventschedule__active=True, 
                     eventschedule__sales_start__lte=now,
                     eventschedule__sales_finish__gte=now)

編集済み 実際には、上記のコードは、同じスケジュールでなくても、これらの基準のいずれかに一致するスケジュールを持つイベントを表示します。これには実際には、次のように実行できるサブクエリが必要です。

Event.objects.filter(eventschedule__in=EventSchedule.objects.filter(
    (active=True, sales_start__lte=now, sales_finish__gte=now))

3回目の試みはこれでより良いですか?

Event.objects.filter(id__in=EventSchedule.objects.values_list('event').filter(
    (active=True, sales_start__lte=now, sales_finish__gte=now)).distinct()
于 2012-09-13T13:02:46.443 に答える
0

私は単純だと思います:

events = []
obj = EventSchedule.objects.filter(active=True, sales_start__lte=now, sales_finish__gte=now)
for i in obj:
    if not i.event in events:
          events.append(i.event)
于 2012-09-13T13:28:39.130 に答える