2017-04-13 2 views
0

ich modele haben Kategorien zu verwalten, die wie folgt aussieht: Jetztrekursive Daten in django Brotkrümel

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') 

an, dass drei Kategorien: Katze A Cat B, wo Elternteil Katze A Cat C, wo Eltern Katze B

ich möchte eine breacrumb zeigen, wo, für Katzen C, wie sieht:

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

ich zur Zeit bekommen:

Home > Categories > Cat B > Cat C 

aber ich weiß nicht, wie die Eltern meiner Eltern zu bekommen. Allgemeiner gibt es eine Möglichkeit, diese Brotkrume dynamisch von den Eltern zu bauen?

Dank

Antwort

1

Mit der Implementierung (als ‚Adjazenzliste‘ Muster bekannt) Sie haben keine andere Wahl haben, als nach Ihrer aktuellen Kategorie parent ist, dann ist es Eltern Eltern etc:

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 

Dann in Ihrem Vorlage:

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

Nun ist die Adjazenzliste Muster, während die naheliegendste sein und einfachste, zu implementieren, ist sehr ineffizient, wenn y Sie möchten einen ganzen Teil Ihrer Hierarchie auf einmal erhalten (wie hier, aber auch, wenn Sie alle Nachkommen eines bestimmten Knotens usw. haben wollen), da es viele Abfragen erfordert.

Es gibt ein viel effizienteres Muster für die hierarchische Datenmodellierung in SQL (viel effizienter für Leseoperationen, das ist viel weniger effizient für Schreiboperationen), das als "verschachtelte Menge" bekannt ist. Es ist viel komplexer zu implementieren, aber die gute Nachricht ist, dass es bereits eine wiederverwendbare Django-Implementierung gibt, django-mptt, die das für Sie abstrahiert.

Wenn Sie nicht Hunderte von Benutzern haben, die den ganzen Tag große Kategorienbäume hinzufügen/entfernen/reorganisieren, empfehle ich Ihnen dringend, zu mptt (verschachtelte Sets) zu wechseln.

Mehr Infos auf SQL und hierarchische Daten hier: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

und hier: What are the options for storing hierarchical data in a relational database?