如何在 models.py 中制作装饰器?

How can I make a decorator in models.py?

我的 django 模型中有一支足球队 class。我做了 3 种赢、平和输的方法,其中 self.Points_of_the_season 将相应修改(+3 赢,+1 平,+0 输)。但是当我编写这些方法时,我必须在每次调用 3 种方法时更改 self.Match_Played。我怎样才能制作一个名为 @play_match 的装饰器,它将向相关字段加 1?

这是models.py的代码:

class Team(models.Model):
    Team_name = models.CharField(max_length=255)
    Foundation_year = models.IntegerField()
    Points_of_season = models.IntegerField(default=0)
    Match_Played = models.IntegerField(default=0)
    League = models.ForeignKey(League, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.Team_name}-{self.Foundation_year}"

    @play_match
    def win(self):
        self.Points_of_season += 3

    @play_match
    def draw(self):
        self.Points_of_season += 1

    @play_match
    def lose(self):
        pass

与任何其他装饰器一样。装饰器函数的参数应该只是函数,然后你在装饰器函数中定义你的子函数,它将在执行你的函数之前进行“装饰”。所以在这种情况下,我的装饰器函数是 play_match ,它定义了 add_one 接受 self 参数,因此它可以访问 class 变量。然后它递增 Match_Played 然后调用传递给装饰器的函数。

class Team:
    Team_Name = ""
    Foundation_year = 0
    Points_of_season = 0
    Match_Played = 0
    League = "league"

    def __str__(self):
        return f"{self.Team_name}-{self.Foundation_year}"

    def play_match(func):
        def add_one(self):
            self.Match_Played += 1
            func(self)
        return add_one

    @play_match
    def win(self):
        self.Points_of_season += 3

    @play_match
    def draw(self):
        self.Points_of_season += 1

    @play_match
    def lose(self):
        pass

x = Team()
x.win()
print("Num matches: ", x.Match_Played)
x.draw()
print("Num matches: ", x.Match_Played)

输出:

Num matches:  1
Num matches:  2