【问题标题】:access class variable from django model method从 django 模型方法访问类变量
【发布时间】:2017-08-17 20:41:08
【问题描述】:

我有以下 Django models.py:

class members(models.Model):

    def calculate_age(dob):
         return int((datetime.date.today() - dob).days / 365.25  )

    auto_id = models.AutoField(primary_key=True)
    member_name = models.CharField(max_length=25, blank=False, default='')
    member_dob = models.DateField(blank=True)
    wife_name = models.CharField(max_length=25, blank=False, default='')
    wife_dob = models.DateField(blank=True)
    member_age = property(calculate_age(member_dob))
    wife_age = property(calculate_age(wife_dob))

现在来自calculate_age,如果我通过member_dob,它将作为日期字段类型而不是实际值。

但是如果我使用 self 那么它可以正常工作,如下所示,

class members(models.Model):

   def calculate_age(self):
        return int((datetime.date.today() - self.member_dob).days / 365.25  )

    def calculate_age_wife(self):
        return int((datetime.date.today() - self.wife_dob).days / 365.25  )

    auto_id = models.AutoField(primary_key=True)
    member_name = models.CharField(max_length=25, blank=False, default='')
    member_dob = models.DateField(blank=True)
    wife_name = models.CharField(max_length=25, blank=False, default='')
    wife_dob = models.DateField(blank=True)
    member_age = property(calculate_age)
    wife_age = property(calculate_age_wife)

现在的问题是,我需要为多个项目调用此calculate_age,因此需要将值传递给方法

【问题讨论】:

  • 为什么要传递 dob,当您使用 self 时,member 的所有项目都可以访问该方法以及属性(即您的 member_dob)
  • 我已经更新了我的问题,您可以看到有效的问题(即第二个代码),但我只想使用一种方法
  • 哦,现在我明白了。但是您的第一种方法将不起作用,因为您正在传递类属性 (member_dob),因为在您拥有成员实例之前,member_dob 只是一种 models.DateField 并且还没有任何值。当这里的功能相同时,拥有一个函数很好,但唯一的另一种方法是创建第三个函数,例如计算年龄(dob),它实际上计算年龄,并从您的其他 2 个函数中为成员和他的妻子创建一个,你必须调用calculate_age(self.member_dob) 和calculate_age(self.wife_dob)。
  • 在其实例上调用该函数将正常工作。我想你还没有尝试过。
  • 而且由于你的功能只是一个班轮,你还不如按照第二种方法!

标签: python django django-models


【解决方案1】:

更新代码

class members(models.Model):

   def calculate_age(self):
       if self.member_dob:
           return int((datetime.date.today() - self.member_dob).days / 365.25  )
       elif self.wife_dob:
           return int((datetime.date.today() - self.wife_dob).days / 365.25)
       else:
           return None

【讨论】:

  • 这可行,但无论如何,如果必须计算多个年龄,我们必须再次使用多个 if 语句
【解决方案2】:

首先,如果您使用的是 python 2,您需要传递带有参数的 self 实例变量。在 python 3 中,我们不需要显式传递 self 实例。你可以在同一个方法中传递两个参数,内部方法只需要一个检查条件是self引用member_dob或wife_dob

 def calculate_age(self):
        if self.member_dob:
         return int((datetime.date.today()-self.member_dob).days/365.25) 
        else:
         return int((datetime.date.today()-self.wife_dob).days/365.25  ) 

【讨论】:

  • 他希望 calculate_age 成为 django 模型的属性,你的答案将作为方法而不是模型的属性,每次他想要 member_age 或 wife_age 时,他都必须通过相应的 dob。
  • 这是一个小错误,因为我将其视为方法。谢谢
猜你喜欢
  • 2011-09-05
  • 2019-03-18
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2019-08-05
  • 2014-10-10
相关资源
最近更新 更多