按特定顺序更新查询集

Posted

技术标签:

【中文标题】按特定顺序更新查询集【英文标题】:update a queryset in a specific order 【发布时间】:2015-04-13 10:39:25 【问题描述】:

我有一个“索引”字段存储一系列整数,为了安全起见,我将其设置为唯一的。

现在我想将此字段加一,为了保持唯一性,我按降序更新值:

MyModel.objects.all().order_by('-index').update(index=F('index')+1)

令我惊讶的是,在某些机器上出现了 IntegrityError 被提出并抱怨重复的索引值。

有什么我错过的吗?我只能一个一个地保存记录吗?

提前致谢!

更新

我认为根本问题是 SQL UPDATE 命令中没有 ORDER BY(请参阅 UPDATE with ORDER BY 和 SQL Server: UPDATE a table by using ORDER BY)

显然 django 只是将我的语句转换为带有 ORDER_BY 的 SQL UPDATE,这会导致未定义的行为并在每台机器上创建不同的结果。

【问题讨论】:

【参考方案1】:

您正在对查询集进行升序排序。您可以通过按以下顺序在字段名称中添加“-”来使其降序:

MyModel.objects.all().order_by('-index').update(index=F('index')+1)

Django docs for order_by

【讨论】:

以上是关于按特定顺序更新查询集的主要内容,如果未能解决你的问题,请参考以下文章

SQLite。按特定顺序更新主键的值

如何按特定顺序从 select 中执行 Oracle SQL 更新?

快速更新的定义

Django:更新查询集中对象的顺序属性

按日期顺序更新表

在不使用 SQL 游标的情况下插入行和更新表