[英]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.