Методы класса модели 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()
чтобы получить то, что вы желаете.