问题描述
请考虑一个模型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语句。