我想通过使用带注释的值来更新queryset中的所有行。带有注释的Django更新查询集
我有一个简单的模型:
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)
我想awoid此代码:
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为了这个目的?没有关于在文档中使用更新()和批注()的信息。
我不是纯粹的SQL肯定这甚至可能吗?在SQL中执行UPDATE时,我认为不可能加入其他表。 – user27478 2010-12-08 13:56:57
是的,这是可能的 - 通过子查询,例如。 'UPDATE t1 SET a =(从t2.S选择SUM(c),其中t2.b = t1.b)'; – 2015-02-20 15:03:50
你真的想做什么? 您是否试图总结'SigningRelation'表中列'评级'的所有值,然后将其保存为“关系”表上的新行? – phourxx 2015-12-09 20:19:02