我有一个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
。您认为哪种选择最具可扩展性?
我知道我当然可以对此进行测试,但我想知道其他人可能会想到这一点,以及是否有其他解决方案,我没有意识到。
答案 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的树遍历实现。