Методы класса модели Django для предопределенных значений

Я работаю над некоторым Django-кодом, который имеет такую модель:

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

существует около 10 предопределенных пар код / текст, которые хранятся в базе данных. Разбросанные по кодовой базе, я вижу такой код:

status = Status.objects.get(code=0) # successful
status = Status.objects.get(code=1) # failed

Я бы предпочел иметь метод для каждого, чтобы код выглядел примерно так:

status = Status.successful()
status = Status.failed()
etc...

это возможно? Я заглянул к менеджеру, но я действительно не нашел способ. Не пора ли действительно RTFM?

в Java это был бы статический метод, а в Ruby вы бы просто определили метод на себе, но это не так просто в Python, не так ли?

1 ответов


возможно, вы должны реализовать это, определив пользовательский менеджер для своего класса и добавив два метода менеджера в этом менеджере (который, я считаю, является предпочтительным способом добавления функциональности уровня таблицы для любой модели). Тем не менее, другой способ сделать это-бросить два методы класса в вашем классе, который запрашивает и возвращает результирующие объекты, такие как:

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

    @classmethod
    def successful(cls):
        return cls.objects.get(code=0)

    @classmethod
    def failed(cls):
        return cls.objects.get(code=1)

обратите внимание, пожалуйста, что get(), вероятно, бросит различные исключения, такие как Status.DoesNotExist и MultipleObjectsReturned.

и для примера реализации того, как сделать то же самое с помощью менеджеров Django, вы можете сделать что-то вроде этого:

class StatusManager(models.Manager):
    def successful(self):
        return self.get(code=1)

    def failed(self):
        return self.get(code=0)

class Status(models.Model):
    code = models.IntegerField()
    text = models.CharField(maxlength=255)

    objects = StatusManager()

где, вы могли бы сделать Status.objects.successful() и Status.objects.failed() чтобы получить то, что вы желаете.