2017-04-13 66 views
0

我有一个MODELE来管理它看起来像类:递归数据

class Category(models.Model): 
    code = models.IntegerField() 
    name = models.CharField('name', max_length=200) 
    slug = models.SlugField(max_length=200) 
    parent = models.ForeignKey(
     "self", 
     blank=True, 
     null=True, 
     related_name='subcategories') 

现在,假设3类: 猫 B类,其中母公司为猫 猫C,其中父母是猫乙

我想表现出breacrumb其中,对于猫C,看起来像:

Home > Categories > Cat A > Cat B > Cat C 

我目前可以得到:

Home > Categories > Cat B > Cat C 

但我不知道如何获得我父母的父母。 更一般地说,有没有办法建立这种面包屑动态功能的父母?

感谢

回答

1

您的实现(称为“邻接表”模式),你有没有其他的选择,而不是按照你当前类别的parent,那么它的父亲的父亲等:

class Category(models.Model): 
    code = models.IntegerField() 
    name = models.CharField('name', max_length=200) 
    slug = models.SlugField(max_length=200) 
    parent = models.ForeignKey(
     "self", 
     blank=True, 
     null=True, 
     related_name='subcategories') 

    def get_parents(self): 
     parents = [] 
     p = self.parent 
     while p: 
      parents.append(p) 
      p = p.parent 
     parents.reverse() 
     return parents 

然后在你的模板:

{% for parent in cat.get_parents %} 
<a href="{{ p.get_absolute_url }}">{{ parent.label }}</a> 
{% endfor %} 

现在邻接列表模式虽然是最明显也最简单的实现,但当y你希望一次获得整个层次结构的一部分(就像这里,但是如果你想要给定节点的所有后代等),因为它需要很多查询。

对于SQL中的分层数据建模,有更高效的模式(对于读操作效率更高 - 写操作效率更低)称为“嵌套集”模式。实现起来要复杂得多,但好消息是已经有一个可重用的django实现django-mptt,它为你抽象出来。

除非您有数百个用户整天添加/删除/重新组织巨大的分支树,否则我强烈建议您切换到mptt(嵌套集)。

更多的相关信息在SQL和层次DATAS这里:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

这里:What are the options for storing hierarchical data in a relational database?