在Django中使用related_name属性访问父模型中的子模型实例

时间:2018-11-12 17:47:31

标签: django python-3.x

假设我的models.py中有以下配置,

class Parent(models.Model):
   ...fields...

   @property
   def get_trone_heir_name(self):
   TODO: How to access to child models instances and fields?

class MaleChilds(models.Model):
   parent = models.ForeignKey(Parent,on_delete=models.CASCADE,related_name="male_childs")
   name = models.CharField(max_length=100)
   birthday = models.DateTimeField()

class FemaleChilds(models.Model):
   parent = models.ForeignKey(Parent,on_delete=models.CASCADE,related_name="female_childs")
   name = models.CharField(max_length=100)
   birthday = models.DateTimeField()

我想显示父母的继承人姓名,即男性优先于女性,年龄最大的男性优先于最小的男性。我在到达父属性中的子对象时遇到困难。如何称呼他们?如果我写了:Parent.male_childs.all(),则出现以下异常:AttributeError:'ReverseManyToOneDescriptor'对象没有属性'all'。

最诚挚的问候

1 个答案:

答案 0 :(得分:2)

您可以使用self.male_childsself.female_childs来访问它。

由于您要优先考虑男性而不是女性,年龄较大的孩子要优先于年龄较小的孩子,因此我们可以通过以下方式获得对象:

class Parent(models.Model):
   ...fields...

   @property
   def get_trone_heir_name(self):
       heir = self.male_childs.order_by('-age').first()
       if heir is None:
           heir = self.female_childs.order_by('-age').first()
       if heir is not None:
           return heir.name

因此,我们首先在这里查询男孩中年龄最大的孩子,如果没有孩子,那么我们将查询女孩中年龄最大的孩子。如果找到继承人(男性或女性),则返回姓名,否则,返回None

但是我认为可以改善建模。除非MaleChildsFemaleChilds没有太多共同点或具有“不同的行为”,否则最好制作一个对象,并将sex分配为模型的属性。甚至有必要将其与父模型合并,因为目前MaleChildsFemaleChilds显然没有孩子,也没有继承人。