2017-04-13 93 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?