我有一个事件+日期类型表设计。
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)))
这是对的吗?
答案 0 :(得分:0)
逻辑上,过滤器和排除是相同的,因此使用其中一个应返回所需的结果。
“排除”的另一种方法是使用Q objects来制作“非”语句。因此,如果您希望使用status != "expired"
和date < today
获取所有活动,则可以使用
Event.objects.filter(Q(dates_set__date__lt=datetime.date.today()), ~Q(status="expired"))