django - 获取模型方法结果的模型字段

时间:2014-06-11 06:32:57

标签: python django

我有这个模型

class Home(models.Model):
  ...
  number_female = models.IntegerField()
  number_male = models.IntegerField()
  def all_people(self):
     return self.number_female + self.number_male
  all_members = all_people(self)

我得到了:name 'self' is not defined

如何定义获取模型方法结果的字段?这个Home场景只是一个例子,我有更复杂的模型,我只是想让问题更加清晰。

3 个答案:

答案 0 :(得分:1)

如果您想将all_members之类的计算字段添加为模型的一部分,则必须覆盖save函数:

class Home(models.Model):
    ...
    all_members = models.IntegerField()

    def save(self):
        all_members = self.all_people()
        super(Home, self).save()

现在您可以按all_members进行过滤。在这种情况下,最好将@property装饰器用于all_members

另一种方法是使用a different stackoverflow answer中提到的Django的extra方法

答案 1 :(得分:1)

您仍然需要将all_members定义为模型字段(而不是整数),然后在save()实例时使用所需的值填充它。

class Home(models.Model):
  ...
  number_female = models.IntegerField()
  number_male = models.IntegerField()
  all_members = models.IntegerField()


  def save(self):
     self.all_members = self.number_female + self.number_male
     super(Home, self).save()

答案 2 :(得分:0)

我认为Django Managers可以成为解决方案。例如:

自定义管理器:

class CustomFilter(models.Manager):
      def all_people(self):
           return self.number_female + self.number_male

型号:

 class Home(models.Model):
     ....
     objects= CustomFilter()

查看:

allpeople= Home.objects.all_people(Home.objects.all())