Django 1.0 / 1.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に対する以前のすべての投票を合計することにより、過去のいつでもスコアを取得できます。
解決
クエリは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
所属していません StackOverflow