#python #django #django-models
Вопрос:
В чем разница между этими двумя кодами?
Код 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.
Ответ №1:
Выбор сделан в следующем формате:
choice_format = (db_format, display_format)
Это то db_format
, что сохраняется в базе данных.
Это то display_format
, что отображается при вызове get_<FOO>_display
Вы в основном выбираете, что сохранить в БД, целое число или текстовый выбор. Проблема в том, что когда ваша модель сериализуется , если у вас есть поле year
с выбором YearInSchool(models.IntegerChoices):
, у вас будет это:
"year": 1
в вашем JSON, но вы ожидаете, что он покажет «Новичок», конечно, вы можете манипулировать этим на уровне сериализатора, чтобы показать новичка, если year
это 1
так .
IntegerChoices
намного быстрее, когда их просматривают, но они слишком неоднозначны. На вашем месте я бы каждый раз использовал целочисленные варианты и манипулировал ответом через сериализатор, чтобы отображать текст вместо самого целого числа.
Комментарии:
1. @ahmed-i-elsayed, вам не нужно манипулировать ответом через сериализатор, просто используйте get_<FOO>_display.
2. @Абдулла, это все еще называется «манипулировать ответом»