понедельник, 3 июня 2013 г.

Статический метод модели в Django: @staticmethod, @classmethod

Представим, что в нашем Django-проекте есть модель Конкурс (Contest). Конкурс ежегодный, поэтому характеризующая его модель будет иметь атрибут year.
Как же нам в классах представлений получить год последнего прошедшего конкурса?
Конечно! Написать для модели Contest метод, который будет возвращать этот год.
Метод должен быть статическим, т.е. для его вызова нам вовсе будет не нужно создавать экземпляр класса Contest.


Для создания статического метода класса вы можете использовать 2 подхода:

1. Использовать декоратор @classmethod. В этом случае вам нужно указать у метода аргумент cls, куда будет передаваться сам класс.  
Внимание: лучше называть аргумент cls, а не self, т.к. для вызова этого метода экземпляр класса не нужен. После аргумента cls вы можете указать свои аргументы:  
def get_active_year(cls, myarg1, myarg2): ...

class Contest(models.Model):

    # ... атрибуты класса
    
    @classmethod
    def get_active_year(cls):
        contests = Contest.objects.all().order_by('-year')
        # Если конкурсов не найдется, возвратим None
        if len(contests) > 0:
            return contests[0].year
        else:
            return None


2. Использовать декоратор @staticmethod. В этом случае указывать аргументы у метода не обязательно - метод будет работать как обычная функция. Разумеется, вы можете передавать в эту функцию свои аргументы:  
def get_active_year(myarg1, myarg2): ...

class Contest(models.Model):

    # ... атрибуты класса
    
    @staticmethod
    def get_active_year():
        contests = Contest.objects.all().order_by('-year')
        # Если конкурсов не найдется, возвратим None
        if len(contests) > 0:
            return contests[0].year
        else:
            return None

Комментариев нет:

Отправить комментарий