假设我的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'。
最诚挚的问候
答案 0 :(得分:2)
您可以使用self.male_childs
和self.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
。
但是我认为可以改善建模。除非MaleChilds
和FemaleChilds
没有太多共同点或具有“不同的行为”,否则最好制作一个对象,并将sex
分配为模型的属性。甚至有必要将其与父模型合并,因为目前MaleChilds
和FemaleChilds
显然没有孩子,也没有继承人。