как сохранить данные в отношениях «многие ко многим» с использованием турбогенераторов и sqlalchemy - PullRequest
2 голосов
/ 22 января 2010

Привет, у меня много-много отношений между пользователем и группой. И я хотел бы добавить пользователя со многими группами в мою базу данных. Как мне это сделать, если моя база данных выглядит следующим образом

user_group_table = Table('tg_user_group', metadata,
    Column('user_id', Integer, ForeignKey('tg_user.user_id',
        onupdate="CASCADE", ondelete="CASCADE")),
    Column('group_id', Integer, ForeignKey('tg_group.group_id',
        onupdate="CASCADE", ondelete="CASCADE"))
)

class Group(DeclarativeBase):
    """
    Group definition for :mod:`repoze.what`.1

    Only the ``group_name`` column is required by :mod:`repoze.what`.

    """

    __tablename__ = 'tg_group'

    #{ Columns

    group_id = Column(Integer, autoincrement=True, primary_key=True)

    group_name = Column(Unicode(16), unique=True, nullable=False)

    display_name = Column(Unicode(255))

    created = Column(DateTime, default=datetime.now)

    #{ Relations

    users = relation('User', secondary=user_group_table, backref='groups')

    #{ Special methods

    def __repr__(self):
        return '<Group: name=%s>' % self.group_name

    def __unicode__(self):
        return self.group_name

    #}
class User(DeclarativeBase):
    """
    User definition.

    This is the user definition used by :mod:`repoze.who`, which requires at
    least the ``user_name`` column.

    """
    __tablename__ = 'tg_user'

    #{ Columns

    user_id = Column(Integer, autoincrement=True, primary_key=True)

    user_name = Column(Unicode(16), unique=True, nullable=False)

    email_address = Column(Unicode(255), unique=True, nullable=False,
                           info={'rum': {'field':'Email'}})

    display_name = Column(Unicode(255))

    _password = Column('password', Unicode(80),
                       info={'rum': {'field':'Password'}})

    created = Column(DateTime, default=datetime.now)

при этом, однако, я получаю ошибку

@expose()
def  user_save(self, **kw):

    user = User()   
    user.user_name = kw['user_name']
    user.display_name = kw['display_name']
    user.email_address = kw['Email']
    user._password = kw['password']

    user.groups.extend(kw['groups'])



    DBSession.add(user)
    DBSession.flush()
    flash("successfully saved...")


    flash(user)
    redirect("/user_new")

Пожалуйста, помогите мне решить эту проблему. Спасибо заранее

1 Ответ

0 голосов
/ 22 января 2010

Я полагаю, что ответ находится в сообщении об ошибке, которое вы не опубликовали в вопросе. user.groups - это список Group объектов, в то время как вы присваиваете ему список строк (?), Полученных из формы. Также я не вижу явного DBSession.commit() вызова. Вы уверены, что TurboGears сделает это за вас?

...