【问题标题】:Queryset filter/excludes for dates查询集过滤器/排除日期
【发布时间】: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


【解决方案1】:

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

另一种“排除”的方法是使用Q objects 进行“不”声明。因此,如果您想使用 status != "expired"date &lt; today 获取所有事件,您可以使用

Event.objects.filter(Q(dates_set__date__lt=datetime.date.today()), ~Q(status="expired"))

【讨论】:

  • 再次感谢。一定是我精神障碍的日子之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
相关资源
最近更新 更多