Модели Джанго.Выбор текста по сравнению с моделями.Целые числа

#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. @Абдулла, это все еще называется «манипулировать ответом»