将 Django Enum 约束强制到 PostgreSQL 端

Posted

技术标签:

【中文标题】将 Django Enum 约束强制到 PostgreSQL 端【英文标题】:Enforce Django Enum constraints into PostgreSQL Side 【发布时间】:2021-02-14 21:53:33 【问题描述】:

当我创建 Enum 并在 djagno 模型中使用选择时。类似

class User(AbstractBaseUser, PermissionsMixin):
"""User model, all information related to user accounts"""

    class UserAccountStatus(models.TextChoices):
       PENDING = "PENDING", "pending"
       ACTIVATED = "ACTIVATED", "activated"
       BLOCKED = "BLOCKED", "blocked"

       status = models.CharField(choices=UserAccountStatus.choices, default=UserAccountStatus.PENDING)

Django official link for same implementation

如果我通过 pg Admin & update status 字段打开 PostgreSQL 并使用一些虚拟文本,则该行将更新并使用虚拟文本保存。 as shown in image

我也想在 PostgreSQL 数据库端保持相同的约束。 在 SQLAlchemy 中,我们可以通过

db.Enum()

【问题讨论】:

【参考方案1】:

CharField 的choices 属性仅用于在应用程序的Django 端进行验证,而不是在数据库中进行验证。您可以将其视为输入数据验证,将 DB 约束视为数据结构验证(例如确保存在外来对象)。

如果你只用你的 Django 定义的模型来收集你的数据,你会没事的。

如果你真的需要在 postgres 端强制执行它,你必须实现你自己的自定义数据库类型。见this part of the documentation。

但同样,请确保您确实需要此功能。有可能只使用 Django 端验证就可以了。

【讨论】:

以上是关于将 Django Enum 约束强制到 PostgreSQL 端的主要内容,如果未能解决你的问题,请参考以下文章

java中的Enum强制转换

为什么Enum.TryParse需要约束,其中T:struct

SQL学习记录

SQL中Unique约束有啥用啊?

SQL中Unique约束有啥用啊?

Django 1.8.2(使用 Python 3.4):如何将带有选项的 CharField 存储在带有 ENUM 列的 MySQL 表中?