2012-03-03 39 views
4

我有这SQLAlchemy的(使用瓶SQLAlchemy的)对象中定义:将数据添加到相关表的SQLAlchemy

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(20), unique=True) 
    password = db.Column(db.String(30)) 
    email = db.Column(db.String(45), unique=True) 
    friends = db.relationship('Friend', backref='user', 
           lazy='dynamic') 

    def __init__(self, username, password, email): 
     self.username = username 
     self.password = password 
     self.email = email 

    def __repr__(self): 
     return "<User('%s','%s','%s')>" % (self.username, self.email, self.id) 


class Friend(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    userId = db.Column(db.Integer, db.ForeignKey('user.id')) 
    friendId = db.Column(db.Integer) 
    created = db.Column(db.DateTime) 

    def __init__(self, userId, friendId): 
     self.userId = userId 
     self.friendId = friendId 
     self.created = datetime.datetime.now() 

    def __repr__(self): 
     return "<Friend(%i,%i)>" % (self.userId, self.friendId) 

据我了解添加好友我应该可以做这样的事情:

首先获得用户:

MyUser = bpdata.User.query.filter_by(id=1).first() 

获取朋友:

MyFriend = bpdata.User.query.filter_by(id=2).first() 

现在我想这样做:

MyUser.Friends.Append(MyFriend) 

这是可能的,或者我只是对朋友的ID直接添加到表中的朋友?

+0

我认为你正在创建错误的关系。一个用户有很多朋友,同一个朋友可以成为许多用户的朋友,所以你必须使用M2M而不是O2M。 – Nilesh 2012-03-05 05:24:10

回答

8

想通这一个我自己..

我需要什么做的是:

MyUser.friends.append(Friend(MyUser.id, MyFriend.id)) 

,然后提交更新。

更新:

好吧,我发现做我想要的正确方法。首先,我根本不需要朋友表/课程。全码:

association_table = db.Table('association', 
    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) 
    username = db.Column(db.String(20), unique=True) 
    password = db.Column(db.String(30)) 
    email = db.Column(db.String(45), unique=True) 
    friends = db.relationship("User", 
       secondary=association_table, 
       backref='added_by', 
       primaryjoin=id == association_table.c.user_id, 
       secondaryjoin=id == association_table.c.friend_id) 

有了这个,我现在可以做如下:

>>> user1 = User.query.filter_by(id=1).first() 
>>> user1.friends 
[] 
>>> user2 = User.query.filter_by(id=2).first() 
>>> user1.friends.append(user2) 
>>> user1.friends 
[<User('user1','[email protected]','2')>] 
>>> user1.friends[0].added_by 
[<User('admin','[email protected]','1')>]