0

我有一个事件+日期类型的表格设计。

Class Event
   ...

Class EventDate
   ...
   date = models.DateField()
   event = model.ForeignKey(Event)

   class Meta:
       unique_together = ('date', 'event')

我试图找到不再发生的事件,即从今天开始过期。

我尝试了以下查询集:

 Event.objects.filter(dates_set__date__lt = 
 datetime.date.today()).exclude(dates_set__date__gte = datetime.date.today())

由于子查询,SQL 查询对我来说似乎很奇怪,而且看起来很昂贵。

SELECT … FROM "events" INNER JOIN "event_dates" ON ("events"."id" = 
"event_dates"."events_id") WHERE ("event_dates"."date" < '2013-05-02' AND NOT 
(("events"."id" IN (SELECT U1."event_id" FROM "event_dates" U1 WHERE (U1."date"
>= '2013-05-02'  AND U1."event_id" IS NOT NULL)) AND "events"."id" IS NOT NULL)))

它是否正确?

4

1 回答 1

0

从逻辑上讲,过滤器和排除是相同的,因此使用一个或另一个应该返回您想要的结果。

做“排除”的另一种方法是使用Q 对象来做“不”陈述。因此,如果您想获取所有事件,status != "expired"并且date < today可以使用

Event.objects.filter(Q(dates_set__date__lt=datetime.date.today()), ~Q(status="expired"))
于 2013-05-02T03:36:32.980 回答