簡體   English   中英

Django面包屑中的遞歸數據

[英]Recursive data in django breadcrumb

我有一個模型來管理類別,如下所示:

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個類別:貓A,貓B,其中父母是貓A,貓C,父母,是貓B

我想展示一個布雷克拉姆,其中貓C看起來像:

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

我現在可以得到:

Home > Categories > Cat B > Cat C

但我不知道如何獲得父母的父母。 更籠統地說,有沒有辦法建立這種動態的父母面包屑功能?

謝謝

使用您的實現(稱為“鄰接列表”模式),您別無選擇,只能關注當前類別的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 %}

現在,鄰接表模式雖然最容易實現,但最容易實現,但是當您想一次獲得整個層次結構時,效率非常低(就像這里一樣,但是如果您想要給定節點的所有后代,等等),因為它需要很多查詢。

在SQL中,有一種效率更高的模式用於分層數據建模(對於讀取操作而言效率更高,對於寫操作而言效率要低得多)被稱為“嵌套集”模式。 實現起來要復雜得多,但是好消息是,已經有一個可重用的django實現,即django-mptt,可以為您抽象化此實現。

除非您有成百上千的用戶整天添加/刪除/重組巨大的目錄樹,否則我強烈建議您切換到mptt(嵌套集)。

有關SQL和分層數據的更多信息,請參見: http : //mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

在這里: 在關系數據庫中存儲分層數據的選項有哪些?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM