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

时间:2013-11-11 08:26:31

标签: 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)

您和我可以在两个不同的列表中使用相同的项目,例如Avocado,它们将指向相同的Avocado对象。

对每个列表中的项目实施任意订单的最佳方法是什么,可以针对每个列表单独编辑? (即我在列表中首先Avocado,而你在索引4上有{{1}}

django-ordered-model似乎是一个有趣的解决方案,但它假定所有对象的全局顺序。

1 个答案:

答案 0 :(得分: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)

因此,您可以执行<{p}}而不是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)