在Django中依次获取上一个和下一个对象 - 什么是最有效的?

时间:2013-08-09 07:59:05

标签: django django-models

我有一个Chart模型,其中包含多个Box模型(因此Box具有Chart的外键。 Box模型有一个字段number,用于定义Chart内的订单。

现在Box将有一个返回其内容的方法。内容是什么,取决于前一个框和下一个框的属性(如果有的话)。因此,从Box模型我需要引用前面的Box和upcomming Box

现在我看到两个选项:

  • 为上一个和下一个Box创建外键。
  • Chart询问number = (current box number -1 or +1)
  • 的方框

最有效的方法是什么?为什么?如果我使用foreignkey方法,它会进行额外查询还是自动建立连接?当然,我必须在查询集上使用select_related来获取完整的Chart。您认为哪种选择最具可扩展性?

我知道我当然可以对此进行测试,但我想知道其他人可能会想到这一点,以及是否有其他解决方案,我没有意识到。

1 个答案:

答案 0 :(得分:1)

可能的解决方案是Box模型中的以下方法:

def get_ordering(self):
   try:
       top = Box.models.filter(number__lt=self.number).order_by('-number')[0]
   except IndexError:
       top = None

   try:
       bottom = Box.models.filter(number__gt=self.number).order_by('number')[0]
   except IndexError:
       top = None

   return top,bottom

但是,更好的解决方案是使用django-mptt django的树遍历实现。