【发布时间】:2013-04-26 03:06:37
【问题描述】:
我有一个事件+日期类型的表格设计。
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)))
这是正确的吗?
【问题讨论】:
-
为什么需要排除?任何一个都不应该自己工作,要么按小于今天的日期过滤,要么排除大于或等于今天的日期?
-
是的,看起来你是对的。排除是不等于的唯一方法吗?说,我有一个额外的条件,我想要 "status != expired" ,我将如何在不运行排除(子查询)的情况下做到这一点
-
你可以用Q objects:
~Q(status="expired") -
谢谢。你能发布一个答案以便我标记它吗?
标签: sql django datetime filter django-queryset