6

У меня есть модель, представляющая пользователя, и я хочу создать отношения между пользователями, представляющими их друзей. Моя функциональная модель со столом и методами объединения перечислить все друзья выглядят такSQLAlchemy - самореляционное отношение Many-to-many с дополнительным столбцом

friendship = db.Table('friend', 
    db.Column('id', db.Integer, primary_key=True), 
    db.Column('fk_user_from', db.Integer, db.ForeignKey('user.id'), nullable=False), 
    db.Column('fk_user_to', db.Integer, db.ForeignKey('user.id'), nullable=False) 
) 

class User(db.Model): 
    ... 
    ... 
    friends = db.relationship('User', 
     secondary=friendship, 
     primaryjoin=(friendship.c.fk_user_from==id), 
     secondaryjoin=(friendship.c.fk_user_to==id), 
     backref = db.backref('friend', lazy = 'dynamic'), 
     lazy = 'dynamic') 

    def list_friends(self): 
     friendship_union = db.select([ 
         friendship.c.fk_user_from, 
         friendship.c.fk_user_to 
         ]).union(
          db.select([ 
           friendship.c.fk_user_to, 
           friendship.c.fk_user_from] 
          ) 
        ).alias() 
     User.all_friends = db.relationship('User', 
         secondary=friendship_union, 
         primaryjoin=User.id==friendship_union.c.fk_user_from, 
         secondaryjoin=User.id==friendship_union.c.fk_user_to, 
         viewonly=True) 
     return self.all_friends 

Проблема заключается в том, что мне нужно реализовать просить frienship и ожидающий до подтверждения (так же, как вы знаете, это от Facebook), так что необходимо добавить дополнительный столбец в таблицу frienship. В соответствии с SQLAlchemy tutorial я должен создать объект ассоциации, но как сделать его снова ссылкой?

Или можно просто добавить этот столбец в текущую таблицу frienship и получить доступ и изменить значение статуса там?

Благодаря

ответ

2

Все, что вам нужно, это добавить primaryjoin в таблице, а также сделать два ForeignKey в таблице дружбы «primary_key» тоже. вам также нужно сделать дружбу как класс.

class Friendship(db.Model): 
    __tablename__ = 'friend' 
    fk_user_from = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) 
    fk_user_to = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) 
    extra_field = db.Column(db.Integer) 


class User (db.Model): 
    __tablename__ = 'user' 
    id = db.Column(db.Integer, primary_key=True) 
    user_to = db.relationship('Friendship',backref='to', primaryjoin=id==Friendship.fk_user_to) 
    user_from = db.relationship('Friendship',backref='from', primaryjoin=id==Friendship.fk_user_from) 

И добавить друга, что вам нужно определить, как дружба:

friend = Friendship(extra_field=0 , to=me , from=my_friend) 
+0

Я решил это так же, как уже, но спасибо за ваш ответ :) принимающему – skornos

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