与枚举的多对多关系

问题描述 投票:0回答:1

我有带有用户和用户组的模型/表。

class User(db.Model, UserMixin):

    __tablename__ = "user"

    id = db.Column(
        db.Integer,
        primary_key=True
    )
    username = db.Column(
        db.String(20),
        unique=True
    )
    [...]
    group_id = db.Column(db.Integer, ForeignKey('user_group.id'))
    group = db.relationship(UserGroup)
    [...]
class UserGroup(db.Model):

    __tablename__ = "user_group"

    id = db.Column(
        db.Integer,
        primary_key=True
    )
    name = db.Column(
        db.String(32),
        unique=False
    )
    [...]

以及具有特权类型的枚举

from enum import Enum


class UserGroupPrivilege(Enum):

    PAYMENTS = "payments"
    USERS_MANAGEMENT = "users_management"
    [...]

有什么方法可以连接它以在 Flask-admin 中以良好的视图显示和编辑它吗? 类似于多对多关系,但使用 UserGroup 来枚举 UserGroupPrivilege。

我希望获得这样的效果:当我编辑用户组时,我可以添加或删除权限,但只能从枚举值中选择它们。 与我编辑 UserGroupPrivilege 时的用户相同。

python enums flask-sqlalchemy flask-admin
1个回答
0
投票

我自己正在寻找这个问题的答案,似乎这种模式通常不被采用。另一种方法是将枚举值替换为在其自己的表中包含这些值的记录。然后您通过多对多关系连接到该表。

例如,您可以创建一个

UserGroupPrivilege
模型而不是像这样的 Enum:

class UserGroupPrivilege(db.Model):

    __tablename__ = "user_group_privilege"

    id = db.Column(
        db.Integer,
        primary_key=True
    )
    name = db.Column(
        db.String(32),
        unique=False
    )

然后您可以使用枚举选项的值填充该模型的数据库表中的记录:

1,payments
2,users_management

您可以通过使用固定装置或数据迁移来自动化此数据填充步骤,该固定装置或数据迁移与用于在数据库本身中创建表的架构迁移一起发生。它本质上实现了与硬编码枚举值相同的目的,但更好,因为它可以稍后在数据库中修改,而不必更改代码。

这就是我解决您发布的原始问题的方法,到目前为止它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.