【问题标题】:django: RelatedManager for chained relations objectsdjango:用于链接关系对象的 RelatedManager
【发布时间】:2017-11-11 12:43:40
【问题描述】:

所以我有模型:

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

请忽略糟糕的数据库/模型设计(这只是对我复杂的现实应用程序的类比)。

我想为Parent 添加一个RelatedManager,可能命名为family_photo_set,这将返回一个Queryset,其中包含他自己的所有Photos、他的Children 和所有Children'Grandchildren。我该如何做到这一点?一个简单的RelatedManager 让我只能以某种方式过滤Parents' parentphoto_set,而不是真正添加其他家庭成员。

【问题讨论】:

  • 你是停留在三层深度,还是可以有任意数量的层?
  • @WillemVanOnsem - 是的,我停在三个级别。

标签: django django-orm


【解决方案1】:

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

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 %}
(...)

【讨论】:

  • +1 每个其他带有查询集的解决方案都需要修改模型并且只有一个类 Photo 带有 GenericForeignKey 或三个外键。请接受您的答案,以便在您不等待更多答案的问题列表中明确。
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2017-03-04
  • 2011-09-19
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多