首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在两个Django类之间共享Python方法?

如何在两个Django类之间共享Python方法?
EN

Stack Overflow用户
提问于 2020-10-23 19:41:26
回答 2查看 486关注 0票数 0

我的Django models.py文件中有两个类:

代码语言:javascript
复制
class ProfileManager(models.Manager):
    def create_profile(self, user, member):
        # Set default age to 100 years old when profile is created.
        years_ago100 = datetime.datetime.now() - datetime.timedelta(days=101 * 365)
        age = calculate_age(years_ago100)       # <- Used here
        profile = self.create(user=user, person_dob=years_ago100, person_age=age)
        return

class Profile(models.Model):
    person_dob = models.DateField()
    person_age = models.IntegerField()

    objects = ProfileManager()

    def save(self, *args, **kwargs):
      # Update to real age when user edits profile for the first time.
      self.person_age = calculate_age(self.person_dob)    # <- Used here too
      super(Profile, self).save(*args, **kwargs)

每个类都使用此calculate_age方法:

代码语言:javascript
复制
def calculate_age(born):
    today = datetime.date.today()
    return (today.year - born.year - ((today.month, today.day) < (born.month, born.day)))

如何使两个类都可以访问此方法?一种简单的方法是将该方法变成这样的全局方法,但这似乎是一种简单的方法:

代码语言:javascript
复制
def calculate_age(born):
  ...

class ProfileManager(models.Manager):
  ...

class Profile(models.Model):
  ...

而且,如果我想在这个特定的模型模块之外访问该方法,这是行不通的。在使用Django时,有标准的方法来做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2020-10-23 19:45:49

您可以将函数calculate_age保存到另一个文件中,然后将其导入到models.py文件的顶部。这将允许访问内部的所有类/方法/函数。

票数 0
EN

Stack Overflow用户

发布于 2020-10-23 20:22:49

可以尝试类似于多重继承之类的东西吗?不太确定这会比你所做的事情的全局功能更好。

代码语言:javascript
复制
class Profile(models.Model):
    person_dob = models.DateField()
    person_age = models.IntegerField()

    objects = ProfileManager()

    def save(self, *args, **kwargs):
        # Update to real age when user edits profile for the first time.
        self.person_age = self.calculate_age(self.person_dob)    # <- Used here too
        super(Profile, self).save(*args, **kwargs)

    def calculate_age(born):
        today = datetime.date.today()
        return (today.year - born.year - ((today.month, today.day) < (born.month, born.day)))


class ProfileManager(models.Manager, Profile):
    def create_profile(self, user, member):
        # Set default age to 100 years old when profile is created.
        years_ago100 = datetime.datetime.now() - datetime.timedelta(days=101 * 365)
        age = self.calculate_age(years_ago100)       # <- Used here
        profile = self.create(user=user, person_dob=years_ago100, person_age=age)
        return

如果您不喜欢从您的Profile类继承整个models.Model,您可以创建一个共享类,它们都可以从中继承。

代码语言:javascript
复制
class Profile(models.Model, helpers):
    person_dob = models.DateField()
    person_age = models.IntegerField()

    objects = ProfileManager()

    def save(self, *args, **kwargs):
        # Update to real age when user edits profile for the first time.
        self.person_age = self.calculate_age(self.person_dob)    # <- Used here too
        super(Profile, self).save(*args, **kwargs)


class ProfileManager(models.Manager, helpers):
    def create_profile(self, user, member):
        # Set default age to 100 years old when profile is created.
        years_ago100 = datetime.datetime.now() - datetime.timedelta(days=101 * 365)
        age = self.calculate_age(years_ago100)       # <- Used here
        profile = self.create(user=user, person_dob=years_ago100, person_age=age)
        return


class helpers():
    def calculate_age(self, born):
        today = datetime.date.today()
        return (today.year - born.year - ((today.month, today.day) < (born.month, born.day)))

    def other_shared_method(self):
        pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64506347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档