Как сделать декоратор в models.py?

У меня есть класс футбольной команды в моей django Model. Я сделал 3 метода победы, ничьей и поражения, где self.Points_of_the_season будет изменяться соответственно (+3 для победы, +1 для ничьей и +0 для поражения). Но когда я написал эти методы, мне приходится изменять self.Match_Played при каждом вызове этих 3 методов. Как я могу сделать декоратор с именем @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

Как и любой другой декоратор. Аргументом функции-декоратора func должна быть просто функция, затем вы определяете свою подфункцию внутри функции-декоратора, которая будет выполнять "украшение" перед выполнением вашей функции. В данном случае, моя функция-декоратор play_match, которая определяет add_one, которая принимает аргумент self, чтобы получить доступ к переменным класса. Затем она увеличивает 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
Вернуться на верх