Как использовать перечисления в качестве поля выбора в модели Django - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть класс модели, для которого я хочу, чтобы два поля были полями выбора, поэтому для заполнения этих вариантов я использую перечисление, перечисленное ниже

#models.py
class Transaction(models.Model):
    trasaction_status = models.CharField(max_length=255, choices=TransactionStatus.choices())
    transaction_type = models.CharField(max_length=255, choices=TransactionType.choices())

#enums.py
class TransactionType(Enum):

    IN = "IN",
    OUT = "OUT"

    @classmethod
    def choices(cls):
        print(tuple((i.name, i.value) for i in cls))
        return tuple((i.name, i.value) for i in cls)

class TransactionStatus(Enum):

    INITIATED = "INITIATED",
    PENDING = "PENDING",
    COMPLETED = "COMPLETED",
    FAILED = "FAILED"
    ERROR = "ERROR"

    @classmethod
    def choices(cls):
        print(tuple((i.name, i.value) for i in cls))
        return tuple((i.name, i.value) for i in cls)

Однако, когда я пытаюсь получить доступЭта модель через администратора Я получаю следующую ошибку:

Django Version: 1.11
Exception Type: ValueError
Exception Value:    
too many values to unpack (expected 2)

Я следовал две статьи, которые описали, как использовать перечисления:

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Проблема в вашем коде в том, что INITIATED = "INITIATED", запятая после INITIATED опция и другие опции.Когда мы добавляем запятую после любой строки, она становится кортежем.См. Пример ниже

s = 'my str'
print(type(s))
# output: str

s = 'my str',
print(type(s))
# output: tuple

models.py

class Transaction(models.Model):
    trasaction_status = models.CharField(max_length=255, choices=TransactionStatus.choices())
    transaction_type = models.CharField(max_length=255, choices=TransactionType.choices())

enums.py

class TransactionType(Enum):

    IN = "IN"
    OUT = "OUT"

    @classmethod
    def choices(cls):
        print(tuple((i.name, i.value) for i in cls))
        return tuple((i.name, i.value) for i in cls)

class TransactionStatus(Enum):

    INITIATED = "INITIATED"
    PENDING = "PENDING"
    COMPLETED = "COMPLETED"
    FAILED = "FAILED"
    ERROR = "ERROR"

    @classmethod
    def choices(cls):
        print(tuple((i.name, i.value) for i in cls))
        return tuple((i.name, i.value) for i in cls)
0 голосов
/ 21 февраля 2019

Вы определяете Enum, устанавливая различные параметры, как описано здесь :

class TransactionStatus(Enum):

    INITIATED = "INITIATED"
    PENDING = "PENDING"
    COMPLETED = "COMPLETED"
    FAILED = "FAILED"
    ERROR = "ERROR"

Обратите внимание, что запятых нет!Это позволяет вам позже в вашем коде ссылаться на TransactionStatus.ERROR или TransactionStatus.PENDING.

Остальная часть вашего кода верна.Вы получаете choices, создавая кортежи option.name, option.value.

0 голосов
/ 21 февраля 2019

Согласно вашей ссылке от https://hackernoon.com/using-enum-as-model-field-choice-in-django-92d8b97aaa63. Варианты должны быть списком кортежей, в то время как ваш вернет кортеж кортежей.Более того, я отличается от i.name.Попробуйте:

#enums.py
class TransactionType(Enum):

    IN = "IN",
    OUT = "OUT"

    @classmethod
    def choices(cls):
        return [(i, i.value) for i in cls]
...