使用自定义字段在Django中订购ManyToMany关系

时间:2018-08-19 09:11:53

标签: django many-to-many

在Django中,我想要一个有序的多对多关系。假设我有模型OrderedListItem,并且我希望能够将Item()s插入到特定索引处的OrderedList()中,我希望能够检索Item()s的{​​{1}}的顺序,并更改OrderedList()Item()s的顺序

我已经找到Define an order for ManyToManyField with djangohttps://github.com/gregmuellegger/django-sortedm2m

github仓库和SO问题中可接受的答案都使用相同的体系结构:它们在结点(“直通”)表上创建了一个表示{n}位置的附加整数字段,例如OrderedListorder_index上的Item()

老实说,我不太喜欢。如果我正确地看到了这一点,那么当我想对OrderedList()重新排序时,将顺序存储在联结表上可能会导致效率低下:想象一下,我想更改Item()sItem()上的位置其中有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)子类化。但是我不知道该怎么做,所以你能给我一些指导吗?

0 个答案:

没有答案