2010-01-22 6 views
2

안녕하세요 저는 사용자와 그룹 간의 많은 관계가 많습니다. 데이터베이스에 많은 그룹이있는 사용자를 추가하고 싶습니다. turbogears 및 sqlalchemy를 사용하여 many to many 관계의 데이터를 저장하는 방법

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") 

pls는 저

답변

0

내가 대답에 믿고 사전에 this.thanks를 해결하는 데 도움이 다음 내 데이터베이스 인 것처럼 그렇게 어. 질문에 게시하지 않은 메시지. user.groupsGroup 개체의 목록이며 폼에서 가져온 문자열 (?) 목록을 할당합니다. 또한 명시적인 DBSession.commit() 호출을 볼 수 없습니다. 터보 기어가 당신을 위해 그것을 할 것이라고 확신합니까?

+0

예, 오류가 발생하지 않으면 TurboGears가 자동으로 세션을 wsgi 스택에서 더 커밋합니다. 또한 예외가 발생하면 트랜잭션을 롤백합니다. – moschlar