如何在 Peewee 中实现 ENUM/SET

How to implement ENUM/SET in Peewee

我已经用 Peewee CHOICES 替换了 MariaDB 中的 ENUM 功能: https://docs.peewee-orm.com/en/latest/peewee/models.html

class Catalog(BaseModel):
    STATUS_CHOICES = (
        (0,'New'),
        (1,'Processing'),
        (2,'Installed'))
    status = CharField(max_length=10, verbose_name='Status', choices=STATUS_CHOICES, default='New', constraints=[SQL("DEFAULT 'New'")])

但是,我坚持要替换有点类似的 SET 功能:https://mariadb.com/kb/en/set-data-type/

这里是 SQL 语法中的字段:

   `Ports` set('443','587','636','990','993','995','1054','3128','3129','3306','5432','6697','8000','8443','9443','61617') NOT NULL DEFAULT '443',

数据看起来像这样,基本上是一个具有有限选项集的多select字段:

+---------------+
| Ports         |
+---------------+
| 443           |
| 8443          |
| 443,9443      |
| 3306          |
| 443,3128,8000 |
| 587           |
+---------------+

尽可能避免使用单独的 table 来保存此数据。

欢迎任何想法。

所以第一个选项是子类化并为集合类型创建自定义字段。我不确定它是如何工作的,因为我从来没有在 MariaDB 中使用过这个功能——但它应该是可能的。文档:http://docs.peewee-orm.com/en/latest/peewee/models.html#creating-a-custom-field

您可以尝试使用整数(通常为 64 位)的 Peewee 内置 BitField,这样您就可以使用位掩码来有效地表示一组 64 个值——顺便说一句,我猜这个这就是 MariaDB 在幕后所做的事情。这里的文档:http://docs.peewee-orm.com/en/latest/peewee/models.html#bitfield-and-bigbitfield