【发布时间】:2011-04-08 20:09:21
【问题描述】:
我想使用带注释的值更新查询集中的所有行。
我有一个简单的模型:
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)
我想避免这段代码:
for relation in Relation.objects.annotate(total_rating=Sum('sign_relations__rating')):
relation.rating = relation.total_rating or 0
relation.save()
并使用以下内容在 一个 SQL 请求中进行更新:
Relation.objects.update(rating=Sum('sign_relations__rating'))
不起作用:
TypeError: int() argument must be a string or a number, not 'Sum'
或
Relation.objects.annotate(total_rating=Sum('sign_relations__rating')).update(rating=F('total_rating'))
也不行:
DatabaseError: missing FROM-clause entry for table "relations_signrelation"
LINE 1: UPDATE "relations_relation" SET "rating" = SUM("relations_si...
是否可以为此目的使用 Django 的 ORM?文档中没有关于同时使用 update() 和 annotate() 的信息。
【问题讨论】:
-
我不确定这在纯 SQL 中是否可行?在 SQL 中进行 UPDATE 时,我认为不可能加入其他表。
-
是的,这是可能的 - 通过子查询,例如。
UPDATE t1 SET a = (SELECT SUM(c) from t2 where t2.b=t1.b); -
你真正想做什么?您是否尝试总结“SigningRelation”表中“rating”列的所有值,然后将其保存为“Relation”表中的新行?
标签: django django-models sql-update django-queryset