Python 在Django中一次更新所有模型
在Django(python)中,我试图一次按特定顺序更新所有对象的位置字段 我现在就是这样做的,但问题是它会产生大量的查询Python 在Django中一次更新所有模型,python,sql,django,Python,Sql,Django,在Django(python)中,我试图一次按特定顺序更新所有对象的位置字段 我现在就是这样做的,但问题是它会产生大量的查询 servers = frontend_models.Server.objects.all().order_by('-vote_count') i = 1 for server in servers: server.last_rank = i server.save() i += 1 有没有一种更新
servers = frontend_models.Server.objects.all().order_by('-vote_count')
i = 1
for server in servers:
server.last_rank = i
server.save()
i += 1
有没有一种更新的方法
Model.objects.all().order_by('some_field').update(position=some_number_that_changes_for each_object)
谢谢大家! 您可以使用django.db.models
中的表达式执行相同的操作:
Model.objects.all().order_by('some_field').update(position=F(some_field)+1)
这将生成一个SQL查询来更新所有列值,因此对数据库来说也很有效。据我所知,Django的对象关系映射系统没有提供一种表示此更新操作的方法。但如果您知道如何用SQL表示,则可以通过以下方式运行: 不同的数据库引擎以不同的方式表示此操作。在MySQL中,您可以运行以下查询:
SET @rownum=0;
UPDATE myapp_server A,
(SELECT id, @rownum := @rownum + 1 AS rank
FROM myapp_server
ORDER BY vote_count DESCENDING) B
SET A.rank = B.rank
WHERE A.id = B.id
在PostgreSQL中,我想您应该使用
UPDATE myapp_server A,
(SELECT id, rownumber() AS rank
OVER (ORDER BY vote_count DESCENDING)
FROM myapp_server) B
SET A.rank = B.rank
WHERE A.id = B.id
(但这是未经测试的,所以要小心!)要增加每个对象的传递数吗?django查询api没有(我想)。如果您的RDBMS具有此功能,则应该执行。这并不能回答OP的问题,因为F()只能根据同一行中某个字段的值进行计算,而不是按他希望的那样跨行递增。对于特定的问题,可以对其进行重构,使其也可以在同一行上工作;否?只有当我可以使用前一行和F(前一行的同一个字段)+1“F()的实例作为对查询中模型字段的引用时,这才能起作用。然后,这些引用可以在查询筛选器中用于比较同一模型实例上两个不同字段的值。”因此,这并不能完成OP需要做的事情。同样,我们应该在F(‘some_字段’)中加上一些引号,以便真正明确。
UPDATE myapp_server A,
(SELECT id, rownumber() AS rank
OVER (ORDER BY vote_count DESCENDING)
FROM myapp_server) B
SET A.rank = B.rank
WHERE A.id = B.id