使用Django的ORM重写“SELECT DISTINCT ON ...”

时间:2010-09-19 01:48:19

标签: sql django orm

我在Django中使用以下模型:

class Hit(Model):
    image = ForeignKey(Image)
    user = ForeignKey(User)
    timestamp = DateTimeField(auto_now_add = True)

我需要的基本上是一个列表,其中包含每个用户创建排名列表的“第一次点击”(即同一图像没有早期时间戳的点击次数)。

或者更简单,只是一个包含用户名的列表,每次该用户进行“第一次点击”时。

在使用PostgreSQL“DISTINCT ON”扩展的SQL中,这将是一个简单的查询,如:

SELECT DISTINCT ON (image_id) user_id FROM proj_hit ORDER BY image_id ASC, timestamp ASC;

有一种方法可以用Django的ORM或(至少)可移植的SQL获得这个结果,即没有PostgreSQL扩展吗?

2 个答案:

答案 0 :(得分:3)

您是否可以自由更改模型?这将有助于将第一个命中信息去标准化并存储在同一模型中或作为不同模型的一部分。

例如

class Hit(Model):
    image = ForeignKey(Image)
    user = ForeignKey(User)
    timestamp = DateTimeField(auto_now_add = True)
    is_first_hit = BooleanField(default = False)

然后,您可以覆盖save()方法(或点按信号)以明确设置is_first_hit。这会使插入和更新更加昂贵,但会使查询变得非常容易。

答案 1 :(得分:0)

我很确定可移植SQL版本与您发布的版本非常相似 - 只需删除ON

SELECT DISTINCT image_id, user_id FROM proj_hit ORDER BY image_id ASC, timestamp ASC;