【问题标题】:Enforce Django Enum constraints into PostgreSQL Side将 Django Enum 约束强制到 PostgreSQL 端
【发布时间】: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()

【问题讨论】:

    标签: django database postgresql enums sqlalchemy


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多