2015-01-02 2 views
1

나는 친구와 친한 친구를 만들 수있는 애플 리케이션을 가지고 지금은 각 사용자가 단 하나의 가장 친한 친구를 갖고 싶어 그래서 다른 기능을 정의해야/플라스크 sqlalchemy 및 many - to - many 관계? 어떠한 제안 ?플라스크 - sqlalchemy 하나만 BestFriend 만들기

model.py 고맙습니다 :

friends = db.Table('friends', 
db.Column('user_id', db.Integer, db.ForeignKey('user.id')), 
db.Column('friend_id', db.Integer, db.ForeignKey('user.id')) 
) 
best_friend = db.Table('best_friend', 
db.Column('user_id', db.Integer, db.ForeignKey('user.id')), 
db.Column('friend_id', db.Integer, db.ForeignKey('user.id')) 
) 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    name = db.Column(db.String(50), index=True, unique= True) 
    email = db.Column(db.String(50),index=True, unique= True) 

    bestfriend = db.relationship('User', 
     secondary = best_friend, 
     primaryjoin = (best_friend.c.user_id == id), 
     secondaryjoin = (best_friend.c.friend_id == id), 
     backref = db.backref('best_friend', lazy = 'dynamic'), 
     lazy = 'dynamic' 
    ) 
def are_bestfriends(self, user): 
     return self.is_bestfriend.filter(best_friend.c.friend_id == user.id).count()> 0 

def be_bestfriend(self, user): 
     if not self.are_bestfriends(user): 
        self.bestfriend.append(user) 
        user.bestfriend.append(self) 
        return self 
+0

사용자가 가장 친한 친구를 한 명만 가질 수 있다면 일대일 관계를 사용하고 다 대다 관계를 사용하지 않을 수도 있습니다. – dirn

+0

그래서 일대일 관계에 대해 검색하면 bestfriend = db.relationship에 uselist = False를 추가해야합니다.하지만 여전히 시도 할 때 가장 친한 친구가 둘 이상있을 수 있습니다. 바로 @dirn입니다. – Linda

+0

현재 데이터 구조 그것을 허용합니다. 당신은 아마 그것을 바꾸고 싶다. – dirn

답변

0

는 일대일로 다 대다 관계에서 변경하려면 best_friends 테이블을 제거하여 시작합니다.

friends = db.Table('friends', 
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')), 
    db.Column('friend_id', db.Integer, db.ForeignKey('user.id')) 
) 

당신은 다른 User 참조 User에 외부 키를 추가 할.

class User(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    name = db.Column(db.String(50), index=True, unique= True) 
    email = db.Column(db.String(50),index=True, unique= True) 

    bestfriend_id = db.Column(db.Integer, db.ForeignKey('user.id')) 

    bestfriend = db.relationship('User', remote_side=['id'], lazy='dynamic') 

    def are_bestfriends(self, user): 
     return self.best_friend == user 

    def be_bestfriend(self, user): 
     if not self.are_bestfriends(user): 
      self.bestfriend = user 
      user.bestfriend = self 
      return self 
+0

고맙습니다. 고맙습니다. 이제 친구에게 도움을 줄 수있는 기능을 정의하고 싶습니다. 아니면 새로운 질문을해야합니까? 데프 un_bestfriend (자체, 사용자) : 경우 self.are_bestfriends (사용자) : 친한 친구 self.is_bestfriend에서 # 삭제 ..... (사용자) user.is_bestfriend ..... (자기) 반환 자기 @ dirn – Linda

+0

값을'None'으로 설정하면됩니다. 'self.bestfriend = None'과'user.bestfriend = None'입니다. – dirn

관련 문제