Django models.TextChoices vs models.IntegerChoices
В чем разница между этими двумя кодами?
Код 1:
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')
Код 2:
class YearInSchool(models.IntegerChoices):
FRESHMAN = 1, _('Freshman')
SOPHOMORE = 2, _('Sophomore')
JUNIOR = 3, _('Junior')
SENIOR = 4, _('Senior')
GRADUATE = 5, _('Graduate')
Почему все используют models.TextChoices
, хотя использование models.IntegerChoices
и models.PositiveSmallIntegerField
займет меньше памяти?
Я что-то упускаю, что-то плохо понимаю?
Когда использовать models.TextChoices
вместо models.IntegerChoices
или наоборот?
Я задаю этот вопрос, потому что в каждом коде django, который я читаю, программист использует текстовые варианты. Я говорю в общем, даже для версий django более ранних, чем 3.
Выбор осуществляется в следующем формате:
choice_format = (db_format, display_format)
db_format
- это то, что сохраняется в БД.
display_format
- это то, что отображается при вызове get_<FOO>_display
Вы в основном выбираете, что сохранить в БД, целое число или текстовый выбор. Проблема в том, что когда ваша модель сериализуется, если у вас есть поле year
с вариантами выбора YearInSchool(models.IntegerChoices):
, у вас будет следующее:
"year": 1
в вашем JSON, но вы ожидаете, что он покажет "Freshman", Конечно, вы можете манипулировать этим на уровне сериализатора, чтобы показать первокурсника, если year
является 1
.
IntegerChoices
намного быстрее, когда они ищутся, но они слишком неоднозначны. На вашем месте я бы использовал IntegerChoices каждый раз и манипулировал ответом через сериализатор, чтобы показать текст вместо самого целого числа.