sqlite Django ORM .distinct()似乎返回重复的结果

flvlnr44  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(147)

我有一个Event模型,它表示一个事件正在发生。我有另一个EventShow模型,它表示事件发生的日期和时间。每个事件可以有多个节目,所以我有一个ForeignKeyEventShowEvent如下-

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进行开发。

kg7wmglp

kg7wmglp1#

问题是,由于.order_by,在SELECT子句中有"core_eventshow"."start_date"。这会导致所选的每一行都彼此 * 不同 *。
删除.order_by应该可以解决这个问题,因为它没有任何有用的用途。
或者,您可以使用PostgreSQL及其DISTINCT ON支持:
仅在PostgreSQL上,您可以传递位置参数(*fields),以指定DISTINCT应应用的字段的名称。这将转换为SELECT DISTINCT ON SQL查询。这就是区别对于普通的distinct()调用,数据库在确定哪些行是不同的时比较每行中的每个字段。对于具有指定字段名的distinct()调用,数据库将只比较指定的字段名。

相关问题