Django acts as tree
Verfasst: Sonntag 31. Mai 2009, 09:50
Rails kann ein Modell relativ einfach zu einem Knoten in einem Baum machen, indem man das `acts_as_tree`-Plugin wie folgt benutzt:
Ich finde diese pseudo-deklarative Form eigentlich gar nicht schlecht, auch wenn man nicht so recht weiß, was da nun eigentlich passiert. Ein Blick in den Quelltext zeigt, dass die Methoden `roots`, `root`, `ancestors` und `siblings` sowie zwei Relationen `parent` und `children` definiert werden. Optional kann man auch noch eine Sortierreihenfolge definieren, aber das soll hier keine Rolle spielen.
Wie sähe die Django-Lösung aus? Ich biete
Ich mache die beiden Namen `parent` und `children` explizit, auch wenn sie eigentlich nicht ohne weiteres änderbar sind. Alternativ ginge auch so etwas:
class Page(models.Model):
acts_as = Tree()
Ich nutze in beiden Fällen aus, dass Django automatisch die Methode `contribute_to_class` für ein Objekt aufruft, das im Kontext eines `Model` einem Attribut zugewiesen wird. Dort kann ich nun alle weiteren Attribute definieren, einen Manager zu weisen und weitere Methoden erzeugen. Funktioniert ausgezeichnet :)
Spricht etwas dagegen? Hat jemand noch eine bessere Idee für die Benamsung?
Stefan
Code: Alles auswählen
class Page
acts_as_tree
end
Wie sähe die Django-Lösung aus? Ich biete
Code: Alles auswählen
class Page(models.Model):
parent = acts_as.Tree(related_name='children')
class Page(models.Model):
acts_as = Tree()
Ich nutze in beiden Fällen aus, dass Django automatisch die Methode `contribute_to_class` für ein Objekt aufruft, das im Kontext eines `Model` einem Attribut zugewiesen wird. Dort kann ich nun alle weiteren Attribute definieren, einen Manager zu weisen und weitere Methoden erzeugen. Funktioniert ausgezeichnet :)
Code: Alles auswählen
class Tree(object):
def contribute_to_class(self, model, name):
TreeManager().contribute_to_class(model, 'objects')
models.ForeignKey('self', related_name='children', blank=True, null=True)\
.contribute_to_class(model, 'parent')
model.ancestors = Tree.ancestors
...
@staticmethod
def ancestors(self):
...
Stefan