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 каждый раз и манипулировал ответом через сериализатор, чтобы показать текст вместо самого целого числа.

Вернуться на верх