Как вставить данные отношения многие ко многим, используя SQLAlchemy со столбцом enum? - PullRequest
1 голос
/ 12 марта 2019

Я использую колбу с SQLAlchemy, есть класс User с отношением многие-ко-многим к роли.Роль имеет свойство name, которое является enum (RoleType).

Когда я пытаюсь вставить нового пользователя с ролью пользователя по умолчанию:

        with client.session() as session:

            r = session.query(Role).filter(RoleType.USER.name == Role.name).first()
            user.roles = [r]

            session.add(user)
            session.commit()

Я получаю следующее исключение:

'RoleType' object has no attribute 'translate'

Вот классы User, Role и RoleType:

from sqlalchemy import ForeignKey, Column, String, Integer, Boolean, Table
from sqlalchemy.orm import relationship, backref

user_role_association_table = Table('user_role', BaseRelation.metadata,
                                Column('user_id', Integer, ForeignKey('user.id')),
                                Column('role_name', Integer, ForeignKey('role.name')))


class User(BaseRelation):
    id = Column(String, primary_key=True, nullable=False)
    email = Column(String, nullable=False)
    password = Column(String, nullable=False)
    active = Column(Boolean, default=False, nullable=False)
    roles = relationship(Role,
                     lazy='subquery',
                     secondary=user_role_association_table)

from enum import auto, Enum

class Role(BaseRelation):
    name = Column(Enum(RoleType), primary_key=True)

    def __init__(self, **kwargs):
        name = kwargs.get("name", None)
        if (name is not None) and isinstance(name, str):
            kwargs["name"] = RoleType.get_type(name)

        super(Role, self).__init__(**kwargs)

    def __eq__(self, other):
        if isinstance(other, dict):
            return self.name == other.get('name', None)

        return self.name == other.name

    def __hash__(self):
        return hash(self.name)

    def __json__(self):
        return ['name']

class RoleType(Enum):
    USER = auto()
    ADMIN = auto()
...