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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top