2013-02-11 85 views
1

我有一个Django模型中的项目列表,我希望能够设置顺序。基本上是一个链表。Django外键排序/位置

class List(models.Model): 
     name = models.CharField(max_length=255) 

class Item(models.Model): 
     list  = models.ForeignKey(List) 
     position = models.PositiveIntegerField() 
     data  = models.AnyField() 

     class Meta: 
      unique_together = ('list', 'position') 
      ordering = ['position'] 

这是我想到的模型。对于列表中的每个ListItem,列表位置必须是唯一的,但它也必须没有间隙(例如,删除项目4不会导致位置顺序[1,2,3,5,6]

回答

1

写入问题我偶然发现了一个possible solution

class Item(models.Model): 
    list = models.ForeignKey(List) 
    # ... 

    class Meta: 
     order_with_respect_to = 'list' 

这个模型可以被操纵,像这样:

list = List.objects.get(id=1) 
list.get_item_order() == [1, 2, 3] 

List对象的相关项目对象的顺序可以通过传递项主要的列表中设置钥匙:

list.set_item_order([3, 1, 2]) 

没有尝试这样的代码,以便随时纠正我(的意见或修改)。

+0

为什么不使用pk而不是位置字段? pk已经给你唯一的ID – catherine 2013-02-11 15:20:46

+0

因为每增加一个pk都会增加 - 无论List fk如何,也许这个pk应该放在列表中间。 – hannson 2013-02-11 16:52:23

+0

'PhotoQueue'对象没有属性'get_photos_order' 这个错误呢? – uzu 2018-02-18 13:22:39