質問

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に対する以前のすべての投票を合計することにより、過去のいつでもスコアを取得できます。

役に立ちましたか?

解決

クエリは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インストールを更新する必要がある場合があります。

他のヒント

集計は問題ではありません。ここでの問題は、DjangoのORMは、ForeignKeyではないものには結合しないことです。

これは現在使用しているものです。皮肉なことに、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top