在Django中,我想要一个有序的多对多关系。假设我有模型OrderedList
和Item
,并且我希望能够将Item()s
插入到特定索引处的OrderedList()
中,我希望能够检索Item()s
的{{1}}的顺序,并更改OrderedList()
上Item()s
的顺序
我已经找到Define an order for ManyToManyField with django和https://github.com/gregmuellegger/django-sortedm2m
github仓库和SO问题中可接受的答案都使用相同的体系结构:它们在结点(“直通”)表上创建了一个表示{n}位置的附加整数字段,例如OrderedList
。 order_index
上的Item()
。
老实说,我不太喜欢。如果我正确地看到了这一点,那么当我想对OrderedList()
重新排序时,将顺序存储在联结表上可能会导致效率低下:想象一下,我想更改Item()s
在Item()
上的位置其中有OrderedList()
n
。这意味着O({Item()s
)个数据库更新将重新组织订单索引。
我想避免这种情况。我想到的是这样一种体系结构:我有一个普通的多对多关系,并且在n
表上有一个附加列,其中包含OrderedList
个项目ID,例如list
。在这种体系结构中,我需要在items_order
上进行一次数据库更新和一次列表操作-我想应该会更快。
我认为最好的方法是创建一个自定义模型字段。文档说明了如何创建自定义模型字段(https://docs.djangoproject.com/en/2.1/howto/custom-model-fields/),我可以像这样创建我的items_order
字段。但是我没有找到如何创建自定义字段的方法,该字段除了创建items_order
之外,还创建联结表并负责在添加新的相关order_list
时更新items_order
或从关系中删除。我认为,我应该将ManyToMany字段(https://docs.djangoproject.com/en/2.1/_modules/django/db/models/fields/related/#ManyToManyField)子类化。但是我不知道该怎么做,所以你能给我一些指导吗?