【问题标题】:Make only one BestFriend with flask-sqlalchemy用 flask-sqlalchemy 只做一个 BestFriend
【发布时间】:2015-01-02 21:08:10
【问题描述】:

我有可以交朋友和最好朋友的应用程序现在我希望每个用户只有一个最好的朋友,所以应该定义另一个函数/我使用了 flask-sqlalchemy 和多对多关系?有什么建议吗?谢谢

模型.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

【问题讨论】:

  • 如果一个用户只能有一个最好的朋友,你可能想使用一对一的关系,而不是多对多的关系。
  • 所以我搜索一对一关系,我应该将 uselist=False 添加到 bestfriend=db.relationship 但是当我尝试它时,我仍然可以拥有多个最好的朋友,我做得对吗@dirn
  • 您当前的数据结构允许。你可能想改变它。
  • 我应该改变哪一部分可以解释得更清楚thanx @dirn
  • 看看stackoverflow.com/questions/27449462的答案。您可以将uselist=False 添加到relationshipbackref 中。

标签: python database flask sqlalchemy flask-sqlalchemy


【解决方案1】:

要从多对多关系更改为一对一关系,首先要删除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

【讨论】:

  • 感谢您的回答-现在我想为不好的朋友定义一个功能,您能帮帮我还是我应该问新问题? def un_bestfriend(self, user): if self.are_bestfriends(user): #remove from bestfriend self.is_bestfriend.....(user) user.is_bestfriend.....(self) return self @dirn
  • 您只需将值设置为Noneself.bestfriend = Noneuser.bestfriend = None.
猜你喜欢
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多