1

有没有办法使用 Django QuerySet 对象重写这个查询:

SELECT b.created_on, SUM(a.vote)
FROM votes a JOIN votes b ON a.created_on <= b.created_on
WHERE a.object_id = 1
GROUP BY 1

votes 是一个表,object_id 是一个多次出现的 int(外键——尽管在这里无关紧要),而 created_on 是一个日期时间。

FWIW,这个查询允许一个人在过去的任何时候通过总结所有以前对该 object_id 的投票来获得分数。

4

3 回答 3

1

我很确定无法使用 Django ORM 创建查询。新的 Django 聚合代码非常灵活,但我认为它不能完全满足您的要求。

您确定该查询有效吗?您似乎错过了 b.object_id 为 1 的检查。

这段代码应该可以工作,但它不止一行而且效率不高。

from django.db.models import Sum

v_list = votes.objects.filter(object__id=1)

for v in v_list:
    v.previous_score = votes.objects.filter(object__id=1, created_on__lte=v.created_on).aggregate(Sum('vote'))["vote__sum"]

聚合仅在主干中可用,因此您可能需要先更新 django 安装才能执行此操作。

于 2009-03-05T11:52:34.930 回答
0

聚合不是问题。这里的问题是 Django 的 ORM 根本不会对任何不是 ForeignKey、AFAIK 的东西进行连接。

于 2009-03-05T16:20:46.660 回答
0

这就是我现在正在使用的。具有讽刺意味的是,sql 被破坏了,但这是它的要点:

    def get_score_over_time(self, obj):
    """
    Get a dictionary containing the score and number of votes 
    at all times historically
    """
    import pdb; pdb.set_trace();
    ctype = ContentType.objects.get_for_model(obj)
    try:
        query = """SELECT b.created_on, SUM(a.vote)
                        FROM %s a JOIN %s b 
                        ON a.created_on <= b.created_on
                        WHERE a.object_id = %s
                        AND a.content_type_id = %s
                        GROUP BY 1""" % (
            connection.ops.quote_name(self.model._meta.db_table),
            connection.ops.quote_name(self.model._meta.db_table),
            1,
            ctype.id,
            )
        cursor = connection.cursor()
        cursor.execute(query)
        result_list = []
        for row in cursor.fetchall():
            result_list.append(row)
    except models.ObjectDoesNotExist:
        result_list = None
    return result_list
于 2009-03-05T21:02:17.030 回答