【发布时间】:2015-03-13 21:59:55
【问题描述】:
我在 Django 1.6.5 上有以下模型
class Location(models.Model):
parent = models.ForeignKey('Location', blank=True, null=True)
name = models.CharField(max_length=50)
class Meta:
db_table = 'locations'
ordering = ('parent__name', 'name')
def __unicode__(self, ):
if self.parent!= None:
return self.name + " (" + self.parent.name + ")"
else:
return self.name
我在下拉列表中列出了这些位置,所以我想显示名称 +(如果可用,则为 parent.name)
知道如何在不必打数千次电话的情况下做到这一点吗?
【问题讨论】:
-
您可能想查看类似django-mptt 的内容,它可以让您非常高效地执行这些查询。
-
来吧,一定有其他方法可以使用第三方库。这是世界上最常见的事情。
-
如果你坚持在 sql 中对树数据进行分层存储,就没有办法做到这一点。您应该查看物化路径模型的嵌套集en.wikipedia.org/wiki/Nested_set_model。据我所知,django-mptt 都做到了
-
多么奇怪的反应。这几乎不是“世界上最常见的事情”:递归关系是一个专门的用例,我们有专门的库来有效地处理查询它们。不过,避免级联数据库调用的一般用例是在最初获取位置列表的查询上使用
select_related。 -
我可能会这样做,只需为此编写一个自定义连接,因为它实际上不需要分页或任何东西。所以它应该是直接的。无论如何,我会用 django-mptt 做一个 POC ......但如果有人有更简单的方法,我还在听。
标签: python django django-models