亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在兩個 Django 類之間共享 Python 方法?

如何在兩個 Django 類之間共享 Python 方法?

桃花長相依 2024-01-04 10:05:24
我的 Django models.py 文件中有兩個類: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)        returnclass 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方法:def calculate_age(born):    today = datetime.date.today()    return (today.year - born.year - ((today.month, today.day) < (born.month, born.day)))如何使兩個類都可以訪問此方法?一種簡單的方法是像這樣使方法全局化,但這似乎是一種笨拙的方法:def calculate_age(born):  ...class ProfileManager(models.Manager):  ...class Profile(models.Model):  ...另外,如果我想在這個特定模型模塊之外訪問該方法,這將不起作用。使用 Django 時有標準方法可以做到這一點嗎?
查看完整描述

3 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

我不知道你為什么認為它很笨拙。當 PyCharm 檢測到某個方法不訪問類成員并因此可以轉換為靜態方法或函數時,這種情況經常發生,PyCharm 甚至使它變得很方便。


最重要的是,Python 導入非常方便。是的,您可以從模塊外部訪問模塊函數,語法與訪問類相同:通過點引用訪問成員。


模塊:


# myapp/utils.py


def calculate_age(born):

    today = datetime.date.today()

    return (today.year - born.year - ((today.month, today.day) < (born.month, born.day)))

#otherapp/models.py

from myapp import utils


class UserProfile(models.Model):

    def clean(self):

        if utils.calculate_age(self.birthday) < 13:

            raise ValidationError("no minors below 13 allowed")


查看完整回答
反對 回復 2024-01-04
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

您可以將函數calculate_age保存到另一個文件中,然后將其導入到models.py文件的頂部。這將允許訪問內部的所有類/方法/函數。



查看完整回答
反對 回復 2024-01-04
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

可以嘗試諸如多重繼承之類的東西嗎?不太確定這會比您所做的事情的全局功能更好


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 ,您可以創建一個共享類,它們都可以繼承。


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


查看完整回答
反對 回復 2024-01-04
  • 3 回答
  • 0 關注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號