我有一个Event
模型,它表示一个事件正在发生。我有另一个EventShow
模型,它表示事件发生的日期和时间。每个事件可以有多个节目,所以我有一个ForeignKey
从EventShow
到Event
如下-
class Event(models.Model):
name = models.CharField(max_length=32)
# ... and more
class EventShow(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='shows')
start_date = models.DateTimeField()
我想得到一个事件列表,其中至少有一个节目在未来发生,所以在我看来,我这样调用ORM-
events = Event.objects.filter(shows__start_date__gt=now()).prefetch_related('shows').distinct().order_by('shows__start_date')
然而,我仍然得到相同的事件显示多次,如果它有多个节目。我该怎么办?
我查看了这个调用生成的SQL-
SELECT DISTINCT "core_event"."id", "core_event"."name", "core_eventshow"."start_date"
FROM "core_event"
INNER JOIN "core_eventshow" ON ("core_event"."id" = "core_eventshow"."event_id")
WHERE ("core_eventshow"."start_date" > 2023-08-16 02:48:46.063093)
ORDER BY "core_eventshow"."start_date" ASC
我正在使用SQLite进行开发。
1条答案
按热度按时间kg7wmglp1#
问题是,由于
.order_by
,在SELECT
子句中有"core_eventshow"."start_date"
。这会导致所选的每一行都彼此 * 不同 *。删除
.order_by
应该可以解决这个问题,因为它没有任何有用的用途。或者,您可以使用PostgreSQL及其
DISTINCT ON
支持:仅在PostgreSQL上,您可以传递位置参数(*fields),以指定DISTINCT应应用的字段的名称。这将转换为SELECT DISTINCT ON SQL查询。这就是区别对于普通的distinct()调用,数据库在确定哪些行是不同的时比较每行中的每个字段。对于具有指定字段名的distinct()调用,数据库将只比较指定的字段名。