как добавить запись по умолчанию с sqlaclhemy (например, пользователь принадлежит к группе) - PullRequest
0 голосов
/ 06 августа 2011

У меня есть две модели: AuthUser и AuthGroup, они связаны через многие-многие отношения. По умолчанию у меня есть как минимум 3 пользовательских "состояния":

  • unlogged -> нет группы
  • залогинен -> группа пользователей
  • admin -> группа администраторов

Я хотел бы быть уверен, что всякий раз, когда новый пользователь добавляется в базу данных, он также добавляется в группу пользователей. Есть ли способ получить эту функциональность в определении модели?

вот мои определения таблиц

Base = declarative_base()

user_group_table = Table('auth_user_groups', Base.metadata,
    Column('user_id', types.Integer(), \
        ForeignKey('auth_users.id', onupdate='CASCADE', ondelete='CASCADE')),
    Column('group_id', types.Integer(), \
        ForeignKey('auth_groups.id', onupdate='CASCADE', ondelete='CASCADE'))
)

class AuthGroup(Base):
    __tablename__ = 'auth_groups'
    __table_args__ = {"sqlite_autoincrement": True}


    id = Column(types.Integer(), primary_key=True)
    name = Column(Unicode(80), unique=True, nullable=False)
    created = Column(types.DateTime(), default=functions.now())

    users = relation('AuthUser', secondary=user_group_table, \
                     backref='auth_groups')

    def __repr__(self):
        return u'%s' % self.name

    def __unicode__(self):
        return self.name


class AuthUser(Base):
    __tablename__ = 'auth_users'
    __table_args__ = {"sqlite_autoincrement": True}

    id = Column(types.Integer(), primary_key=True)
    login = Column(Unicode(80), default=u'', index=True)
    username = Column(Unicode(80), default=u'', index=True)
    _password = Column('password', Unicode(80), default=u'', index=True)
    email = Column(Unicode(80), default=u'', index=True)

    groups = relation('AuthGroup', secondary=user_group_table, \
                      backref='auth_users')

    def _set_password(self, password):
        self._password = bcrypt.hashpw(password, bcrypt.gensalt())

    def _get_password(self):
        return self._password

    password = synonym('_password', descriptor=property(_get_password, \
                       _set_password))

    @classmethod
    def get_by_id(cls, id):
        return DBSession.query(cls).filter(cls.id==id).first()    

    @classmethod
    def get_by_login(cls, login):
        return DBSession.query(cls).filter(cls.login==login).first()

    @classmethod
    def get_by_username(cls, username):
        return DBSession.query(cls).filter(cls.username==username).first()

    @classmethod
    def get_by_email(cls, email):
        return DBSession.query(cls).filter(cls.email==email).first()

    @classmethod
    def check_password(cls, **kwargs):
        if kwargs.has_key('id'):
            user = cls.get_by_id(kwargs['id'])
        if kwargs.has_key('username'):
            user = cls.get_by_username(kwargs['username'])

        if not user:
            return False
        if bcrypt.hashpw(kwargs['password'], user.password) == user.password:
            return True
        else:
            return False

1 Ответ

0 голосов
/ 08 августа 2011

обычно конструктор класса проверяет ожидаемые данные при создании нового объекта (INSERT в ORM, если не считать хитрости для обхода обычной механики, всегда соответствует новому экземпляру сопоставленного класса, созданного с помощью конструктора):

class AuthUser(Base):
    def __init__(self, **kw):
        self.groups = kw.pop('groups', None)
        if not self.groups:
            raise ValueError("at least one group is required!")
        super(AuthUser, self).__init__(**kw)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...