在Django模型中排序多对多关系

Yuv*_*dam 7 django django-models

假设您在Django模型中具有多对多关系,例如:

class GroceryList(models.Model):
    items = models.ManyToManyField(GroceryItem, related_name='in_lists')

class GroceryItem(models.Model):
    name = models.CharField(unique=True)
Run Code Online (Sandbox Code Playgroud)

你和我都可以在两个不同的列表中拥有相同的项目,例如Avocado,它们将指向同一个Avocado对象.

为每个列表中的项目实现任意顺序的最佳方法是什么,可以为每个列表单独编辑?(即我Avocado在我的列表中有第一个,而你在索引中有它4)

django-ordered-model看起来像一个有趣的解决方案,但它假定所有对象的全局顺序.

Roh*_*han 14

您可以使用中间表,through并在该表中添加有序字段.

class GroceryList(models.Model):
    items = models.ManyToManyField(GroceryItem, related_name='in_lists', 
            through='Order')

class GroceryItem(models.Model):
    name = models.CharField(unique=True)

class Order(models.Model):
    number = models.PositiveIntegerField()
    gl = models.ForeignKey(GroceryList)
    gi = models.ForeignKey(GroceryItem)
Run Code Online (Sandbox Code Playgroud)

所以,而不是做grocerylist.items.add(groceryitem)你可以做到的

#for groceryitem1 as 1st item in grocerylist1
Order.objects.create(gl=grocerylist1, gi=groceryitem1, number=1)

#for groceryitem1 as 10th item in grocerylist2
Order.objects.create(gl=grocerylist2, gi=groceryitem1, number=10)
Run Code Online (Sandbox Code Playgroud)