django:链接关系对象的 RelatedManager

django: RelatedManager for chained relations objects

所以我有模型:

class Parent(models.Model):
    name = models.CharField(max_length=100)

class Child(models.Model):
    parent = models.ForeignKey('Parent', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

class Grandchild(models.Model):
    parent = models.ForeignKey('Child', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

class ParentPhoto(models.Model):
    person = models.ForeignKey('Parent', on_delete=models.CASCADE)
    image = models.ImageField()

class ChildPhoto(models.Model):
    person = models.ForeignKey('Child', on_delete=models.CASCADE)
    image = models.ImageField()

class GrandchildPhoto(models.Model):
    person = models.ForeignKey('Grandchild', on_delete=models.CASCADE)
    image = models.ImageField()

请忽略糟糕的 database/models 设计(这只是对我复杂的现实应用程序的类比)。

我想为 Parent 添加一个名为 family_photo_setRelatedManager,这将 return 一个 Queryset 包含他自己的所有 Photos ,他的 Children 和所有 Children' Grandchildren。我该如何实现?一个简单的 RelatedManager 让我只能以某种方式过滤 Parents' parentphoto_set,而不是真正添加其余的家庭成员。

好的,我找到了解决方法。为其他访客发帖。

class Parent(models.Model):
    name = models.CharField(max_length=100)

    def get_family_photos(self):
        family_photos = []
        family_photos.extend(self.parentphoto_set.all())

        for child in self.child_set.all():
            family_photos.extend(child.childphoto_set.all)

            for grandchild in child.grandchild_set.all()):
                family_photos.extend(grandchild.grandchildphoto_set.all())

        return family_photos

这样我就可以使用它,例如在模板中

{% for photo in parent.get_family_photos %}
(...)