我有一个模型类,我希望有两个字段作为选项字段,所以为了填充这些选项,我使用一个枚举,如下所示

#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)

然而,当我试图通过admin访问此模型时,我得到以下错误:

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

我阅读了两篇描述如何使用枚举的文章:

推荐答案

对于Django 2.x及以下:

您可以通过将各种选项设置为here来定义Enum:

class TransactionStatus(Enum):

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

注意没有逗号!这允许您稍后在代码中引用TransactionStatus.ERRORTransactionStatus.PENDING.

代码的其余部分是正确的.通过创建option.nameoption.value的元组得到choices.

UPDATE: For Django 3.x and higher,使用内置类型TextChoicesIntegerChoicesChoices,如here所述.这样你就不必自己构造choices元组了.

Python-3.x相关问答推荐

math. gcd背后的算法是什么,为什么它是更快的欧几里得算法?

在numpy. linalg的qr之后使用scipy. integrate中的solve_ivp时出现了一个奇怪的错误

是否有必要使用Threads()中的args显式地将共享变量传递给Python中的线程函数或直接访问它?

Python根据阈值对数字进行分组

将f-字符串放置在f-字符串内

将两列的乘积连续添加到一列的累积和中

Python 舍入数字不准确

aiogram机器人中处理文本输入异常而不是按钮点击的回调函数.

python3,将整数转换为字节:对于小整数使用 to_bytes() 有哪些替代方法?

包含值超出范围的 ID 的新 DataFrame 列?

在python中将字符串写入文本文件

使用 python 正则表达式匹配日期

Python 3 变量名中接受哪些 Unicode 符号?

Python在OrderedDict中 Select 第i个元素

如何从 Python 3 导入 FileNotFoundError?

pdfminer python 3.5

为什么变量 = 对象不像变量 = 数字那样工作

在 macbook pro M1 上安装 Tensorflow 时出现zsh:非法硬件指令 python

如何创建一个永远在其上运行滚动协程的事件循环?

Python 无法处理以 0 开头的数字字符串.为什么?