Django 1.0 / 1.1 Umschreiben Selbst verbinden
Frage
Gibt es eine Möglichkeit, diese Abfrage neu zu schreiben, die Django QuerySet Objekt mit:
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
Bei Stimmen ist eine Tabelle, object_id ist ein int, die mehrfach vorkommt (Fremdschlüssel - obwohl das spielt hier keine Rolle)., Und created_on, die eine Datetime ist
FWIW, diese Abfrage erlaubt es, eine Punktzahl zu jeder Zeit in der Vergangenheit zu erhalten, indem alle bisherigen Stimmen auf dieser object_id zusammen.
Lösung
Ich bin mir ziemlich sicher, dass Abfrage kann nicht mit dem Django ORM erstellt werden. Der neue Aggregations Code Django ist ziemlich flexibel, aber ich glaube nicht, es zu tun genau das, was Sie wollen.
Sind Sie sicher, dass Abfrage funktioniert? Sie scheinen einen Scheck dass b.object_id 1 zu fehlen.
Dieser Code sollte funktionieren, aber es ist mehr als eine Zeile und nicht so effizient.
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"]
Aggregation ist nur im Kofferraum zur Verfügung, so dass Sie Ihre django aktualisieren müssen möglicherweise installieren, bevor Sie dies tun können.
Andere Tipps
Aggregation ist nicht das Problem; Das Problem hier ist, dass Django ORM einfach tun schließt sich nichts auf, das kein ForeignKey ist, AFAIK.
Das ist, was ich jetzt mit. Ironischerweise die SQL gebrochen ist, aber das ist der Kern von ihm:
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