2010-01-22 4 views
2

salut j'ai une relation de plusieurs à plusieurs entre un utilisateur et un groupe. Et je vais ajouter un utilisateur avec beaucoup de groupes dans ma base de données. faire que si ma base de données est la suivantecomment enregistrer des données dans une relation many to many en utilisant turbogears et sqlalchemy

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) 

cette façon de faire me donne cependant une erreur

@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 me aider à résoudre this.thanks à l'avance

Répondre

0

Je crois que la réponse est en le er message que vous n'avez pas posté dans la question. user.groups est une liste d'objets Group, pendant que vous affectez une liste de chaînes (?) Obtenues à partir du formulaire. Aussi, je ne vois pas d'appel explicite DBSession.commit(). Êtes-vous sûr que TurboGears le fera pour vous?

+0

Oui, TurboGears commettra automatiquement la session plus haut dans la pile wsgi si aucune erreur n'est survenue. Cela annulerait également la transaction si une exception se produisait en cours de route. – moschlar

Questions connexes