Quiero actualizar todas las filas en queryset mediante el uso de un valor anotado.Django queryset de actualización con la anotación
tengo unas modelos simples:
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)
y quiero awoid este código:
for relation in Relation.objects.annotate(total_rating=Sum('sign_relations__rating')):
relation.rating = relation.total_rating or 0
relation.save()
Y NO actualización en uno SQL-petición mediante el uso de algo como esto:
Relation.objects.update(rating=Sum('sign_relations__rating'))
No funciona:
TypeError: int() argument must be a string or a number, not 'Sum'
o
Relation.objects.annotate(total_rating=Sum('sign_relations__rating')).update(rating=F('total_rating'))
tampoco funciona:
DatabaseError: missing FROM-clause entry for table "relations_signrelation"
LINE 1: UPDATE "relations_relation" SET "rating" = SUM("relations_si...
¿Es posible utilizar ORM de Django para este fin? No hay información sobre el uso de update() y annotate() juntos en docs.
No estoy seguro de que esto sea posible, incluso en SQL puro? Al hacer una ACTUALIZACIÓN en SQL, no creo que sea posible unirse a otras tablas. – user27478
Sí, es posible: a través de subconsultas, ej. 'UPDATE t1 SET a = (SELECT SUM (c) desde t2 donde t2.b = t1.b)'; –
¿Qué estás realmente tratando de hacer? ¿Está intentando resumir todos los valores de la columna 'rating' en la tabla 'SigningRelation' y luego guardarlos como una nueva fila en la tabla 'Relation'? – phourxx