我在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扩展)获得此结果?

最佳答案

您可以自由更改模型吗?这将有助于对第一个匹配信息进行反规范化并将其存储在相同模型中或作为不同模型的一部分。

例如

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。这将使插入和更新变得更加昂贵,但会使查询非常容易。

关于sql - 使用Django的ORM重写“SELECT DISTINCT ON …”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3744228/

10-11 02:24
查看更多