Django获取model方法结果的model字段

2024-04-19 04:47:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个模型

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。你知道吗

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


Tags: 模型selfnumberhomemodelreturnmodelsdef
3条回答

您仍然需要将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()

如果要将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过滤。在这种情况下,最好对all_members使用@property装饰器。你知道吗

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

我认为DjangoManagers可以解决这个问题。示例:

自定义管理器:

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

相关问题 更多 >