Показать отношения Django в шаблоне - PullRequest
0 голосов
/ 04 мая 2011

У меня есть модель Django следующим образом:

class Person(models.Model):
    name = models.CharField(max_length=255)

class Relationship(models.Model):
    parent = models.ForeignKey(Person)
    child = models.ForeignKey(Person)
    description = models.TextField(blank=True)

На мой взгляд, я передаю определенного человека и отношения, в которых он / она является родителем:

person = Person.objects.filter(name ='some name')
descendant_relationships = Relationship.objects.filter(parent = person)

Я хочу показать потомков этого человека в списке в шаблоне:

<ul>
{% for item in descendant_relationships%}
    <li> {{item.child.name}}  -  {{item.description}} </li>
{% endfor %}
</ul>

Но этот шаблон кода не будет показывать детей детей (то есть внуков, правнуков и т. Д.). Как я могу заставить этих потомков более низкого уровня появляться? Я предполагаю, что рекурсия необходима где-то, но где?

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Сначала установите связанное имя для ваших отношений ForeignKeys:

parent = models.ForeignKey(Person, related_name='child_relationships')
child = models.ForeignKey(Person, related_name='parent_relationships')

Затем добавьте что-то вроде следующего в ваш Person models.py:

def get_descendants(self):
    descendants = []
    children = [relationship.child for relationship in self.child_relationships.all()]
    for child in children:
        descendants += child.get_descendants()
    return descendants

Вместо метода длявернуть детей, мы можем адаптировать это, чтобы вернуть отношения:

def get_descendant_relationships(self):
    relationships = []
    for child in self.child_relationships.all():
        relationships += child.get_descendant_relationships()
    return descendants
0 голосов
/ 21 июня 2012

Если между родителями и детьми вам нужен только один или несколько отн., Вы можете удалить дополнительную таблицу:

from django.db import models
class Person(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='a_name')

    def genealogical_tree(self, type_of_members, generations):
        """
        @generations: the number of generations to be traversed in the tree(
            controls recursion)
        """
        formated_members = {}
        if generations:
            if type_of_members == 'parent':
                members = [self.parent]
            elif type_of_members == 'children':
                members = self._default_manager.filter(parent=self)
            for member in members:
                formated_members[member.name] = member.genealogical_tree(
                    type_of_members, generations-1)
        return formated_members

Примеры:

from models import Person
f=Person(name='f')
s=Person(name='s')
gs=Person(name='granson')
gs.save()
s.save()
f.save()

s.parent=f
s.save()
gs.parent=s
gs.save()

f.genealogical_tree('children',1)
>>> {u's': {}}
f.genealogical_tree('children', 2)
>>> {u's': {u'granson': {}}}
gs.genealogical_tree('parent', 2)
>>> {'s': {'f': {}}}
gs.genealogical_tree('parent', 1)
>>> {'s': {}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...