Django Поведение TextChoices - PullRequest
       3

Django Поведение TextChoices

0 голосов
/ 02 августа 2020
class MyTypes(TextChoices):
    MINE_AAA = '1', 'a',
    MINE_BBB = '2', 'b',
    MINE_CCC = '3', 'c',
    MINE_DDD = '4', 'd',
    MINE_EEE = '5', 'e'

    my_type = models.CharField(max_length=1, choices=MyTypes.choices)

Я много боролся с возможностью использовать Choices в своих моделях. В приведенном выше примере, если я создаю экземпляр «my_obj» и устанавливаю для «my_obj.my_type» значение «MyTypes.MINE_BBB», если я смотрю на «my_obj», его тип будет MyTypes. Однако, если я позже запрошу «my_obj» и посмотрю на «my_obj.my_type», его тип станет строкой.

Итак, когда я сначала создаю объект и сериализую его, сериализатор должен обрабатывать MyTypes, но если я сериализую значение после запроса, сериализатору потребуется обработать строку.

При использовании поля TextChoices я действительно ожидал, что значение, хранящееся в базе данных, будет единственным символом, но когда Я ссылаюсь на него в коде, я бы увидел свои MyTypes.

Разве мы не должны возвращать экземпляр TextChoices, когда мы ссылаемся на модель? Если нет, то как это проще всего получить? Похоже, что если я после итеративно просмотрю MyTypes.choices, чтобы получить его, он действительно не принесет особой ценности.

Вот как выглядит документация.

class YearInSchool(models.TextChoices):
        FRESHMAN = 'FR', _('Freshman')
        SOPHOMORE = 'SO', _('Sophomore')
        JUNIOR = 'JR', _('Junior')
        SENIOR = 'SR', _('Senior')
        GRADUATE = 'GR', _('Graduate')

1 Ответ

0 голосов
/ 02 августа 2020

поле выбора должно быть списком кортежей

class MyTypes(TextChoices):
    MINE_AAA = ('1', 'a',)
    MINE_BBB = ('2', 'b',)
    MINE_CCC = ('3', 'c',)
    MINE_DDD = ('4', 'd',)
    MINE_EEE = ('5', 'e')

    MY_CHOICES = [
        MINE_AAA,
        MINE_BBB,
        MINE_CCC,
        MINE_DDD,
        MINE_EEE
    ]

    my_type = models.CharField(max_length=1, choices=MY_CHOICES)

Вот как выглядит документация .

class YearInSchool(models.TextChoices):
        FRESHMAN = 'FR', _('Freshman')
        SOPHOMORE = 'SO', _('Sophomore')
        JUNIOR = 'JR', _('Junior')
        SENIOR = 'SR', _('Senior')
        GRADUATE = 'GR', _('Graduate')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...