2015-08-15 4 views
0

Я пытаюсь получить много-много отношений, работающих. У меня есть три таблицымного-много отношений с тремя таблицами (sql-alchemy)

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(64), index=True, unique=True) 

class Groups(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(1000)) 

class Members(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id')) 
    group_id = db.Column(db.Integer, db.ForeignKey('groups.id')) 

Я хотел бы иметь опцию group.members, которые должны дать мне все пользовательские объекты, которые являются членами этой группы. Я реализовал это следующим образом

members = db.relationship('User', secondary="join(Members, User, Members.user_id == User.id)", primaryjoin="and_(Groups.id == Members.group_id)") 

это, кажется, работает, но когда я удалить группу он дает мне (иногда) ошибка

AttributeError: «Регистрация» объект не имеет атрибута «удалить»

, поэтому я думаю, что это неправильный способ реализации такого отношения. Любые идеи, как это сделать правильно? благодаря CARL

ответ

3

Возможно, более простой способ реализации этого заключается в следующем (адаптировано из documentation на Колба-SQLAlchemy

members = db.Table('members', 
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')), 
    db.Column('group_id', db.Integer, db.ForeignKey('groups.id')) 
) 

class Groups(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(1000)) 
    members = db.relationship('User', secondary=members, backref=db.backref('group', lazy='dynamic')) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(64), index=True, unique=True) 

Вместо того, чтобы использовать модель для соединения таблицы (членов), давайте просто использовать . простой стол

С этим в Кoнфигурировании, вы можете легко добавлять/удалять пользователей и группы:

u = User(username='matt') 
g = Groups(name='test') 
db.session.add(u) 
db.session.add(g) 
db.session.commit() 
g.members.append(u) 
db.session.commit() 
db.session.delete(g) 
db.session.commit() 
+0

что золь Кажется, работа прекрасна ... спасибо Мэтту – carl

Смежные вопросы