Django update queryset mit Anmerkung

Ich aktualisieren möchten, werden alle Zeilen in queryset durch die Verwendung von annotierten Wert.

Habe ich eine einfache Modelle:

class Relation(models.Model):
    rating = models.IntegerField(default=0)

class SignRelation(models.Model):
    relation = models.ForeignKey(Relation, related_name='sign_relations')
    rating = models.IntegerField(default=0)

Und ich will awoid diesem code:

for relation in Relation.objects.annotate(total_rating=Sum('sign_relations__rating')):
    relation.rating = relation.total_rating or 0
    relation.save()

Und aktualisieren in eine SQL-Anfrage mit etwas wie dieses:

Relation.objects.update(rating=Sum('sign_relations__rating'))

Nicht funktioniert:

TypeError: int() argument must be a string or a number, not 'Sum'

oder

Relation.objects.annotate(total_rating=Sum('sign_relations__rating')).update(rating=F('total_rating'))

Auch nicht funktioniert:

DatabaseError: missing FROM-clause entry for table "relations_signrelation"
LINE 1: UPDATE "relations_relation" SET "rating" = SUM("relations_si...

Ist es möglich, zu verwenden Djangos ORM für diesen Zweck? Es gibt keine info über die Verwendung update() und annotate() zusammen in docs.

  • Ich bin mir nicht sicher, ob dies auch möglich, in reinem SQL? Wenn Sie eine AKTUALISIERUNG in SQL, ich glaube nicht, dass es möglich ist, mit anderen Tabellen.
  • Ja, es ist möglich - über Unterabfragen, ex. UPDATE t1 SET a = (SELECT SUM(c) from t2 where t2.b=t1.b);
  • Was sind Sie wirklich versuchen, zu tun? Sind Sie versuchen, die Summe aller Werte der Spalte 'Bewertung' auf 'SigningRelation' Tabelle und speichern Sie es dann als eine neue Zeile in der "Verhältnis" - Tabelle?
InformationsquelleAutor ramusus | 2010-09-06
Schreibe einen Kommentar