在Djang中一次更新所有模型

2024-06-09 06:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Django(python)中按特定顺序一次更新所有对象的position字段。

这就是我现在所做的,但问题是它会产生大量的查询。

    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)

谢谢你!


Tags: 对象djangoforbyobjectsserver顺序models
2条回答

您可以使用django.db.models中的^{}表达式执行相同的操作:

Model.objects.all().order_by('some_field').update(position=F(some_field)+1)

它将生成一个SQL查询来更新所有的列值,因此对数据库也是有效的。

据我所知,Django的对象关系映射系统并没有提供一种表达这种更新操作的方法。但是如果您知道如何用SQL来表示它,那么可以通过custom SQL query来运行它:

from django.db import connection
cursor = connection.cursor()
cursor.execute('''UPDATE myapp_server ...''')

不同的数据库引擎以不同的方式表示此操作。在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

(但这还没有测试,所以要小心!)。

相关问题 更多 >