使用具有自定义步长的Django AutoField订购模型

问题描述

请考虑一个模型Section,该模型将显示在网站上,并由用户使用Django管理界面创建/编辑。我想添加一个字段,该字段使用户可以轻松控制网站上各部分的显示顺序。最简单的选择似乎是允许一个整数字段,该字段会自动递增但可由用户编辑-类似于内置AutoField所做的事情。

但是,为了使编辑顺序更容易,我希望每次将字段认值增加10,以使用户可以更轻松地移动部分。第一部分将得到order=1,下一部分将得到order=11,依此类推,这样,通过给定一个部分,例如order=6,就可以将其插入前两个部分。 >

有没有一种方法可以重用AutoField来实现此目的?如果没有,我如何才能最好地实现这种订购方案?

理想情况下,我想要实现的目标应如下所示:

from django.db import models

class Section(models.Model):
    text = models.TextField()
    order = AutoField(step=10)
    
    class Meta:
        ordering = ('order',)

解决方法

Autofield无法正常工作。不可编辑,需要为主键。

我还建议通过在UI中拖放来视觉化地解决此问题,然后对整个区域中的所有部分重新排序,而不是允许楔入。如果两个人同时将20和30楔入25,您仍然会遇到相同的问题。在保存时重新排序是一种更简洁的解决方案,尤其是在使用select_for_update时:

返回一个查询集,该查询集将锁定行直到事务结束,从而在受支持的数据库上生成SELECT ... FOR UPDATE SQL语句。