烧瓶sqlalchemy多对多 - 使用对象

时间:2015-11-01 02:32:56

标签: python many-to-many flask-sqlalchemy

我用sqlalchemy和mysql设置了烧瓶。一切正常,但我仍然很困惑如何访问/使用我的关联表为我的多对多关系。我已经查看了文档,我非常确定我正确设置但不确定如何创建填写联结(关联)表的记录。

我有多对多的关系 -

users <--> teams
users <--> players

我也有一对一的关系,我正在使用而没有问题 -

users --> positions_bb

下面是我的models.py文件。我正在从python CLI进行所有测试(从图片中取出其余的烧瓶框架)。创建用户后,如何在teams_users_map表中创建一个显示user_id键和team_id键的条目?我试过了:

t = models.Team(teamname='exteam')
u = models.User(email='bob@emailcom','password123')

t.user = 1 ('incompatible collection type: int is not list like'). Ok this makes sense - a list is expected.

t.user = [User(1)] - ('User is not defined').  This was just a guess at some examples I saw, didn't make sense to me anyway.

t.users = 1 - this actually did not return an error but it also didn't appear to save anything in the database.

简而言之,我猜是非常愚蠢的问题 - 如何将项目添加到联结表中?

from werkzeug import generate_password_hash, check_password_hash
    from datetime import datetime,timedelta
    from ylm import db

    teams_users_map = db.Table('teams_users_map',
        db.Column('fk_team_id', db.Integer, db.ForeignKey('teams.team_id')),
        db.Column('fk_user_id', db.Integer, db.ForeignKey('users.user_id'))
    )

    teams_players_map = db.Table('teams_players_map',
        db.Column('fk_team_id', db.Integer, db.ForeignKey('teams.team_id')),
        db.Column('fk_player_id', db.Integer, db.ForeignKey('players.player_id'))
    )

    class User(db.Model):
        __tablename__ = 'users'
        user_id = db.Column(db.Integer, primary_key = True)
        email = db.Column(db.String(120))
        pwdhash = db.Column(db.String(200))
        create_date = db.Column(db.Date)
        active = db.Column(db.Integer)

        def __repr__(self):
            return 'UserID: %r\nEmail: %r\nPassword %r\nCreate Date: %r\nActive: %r\n\n' % (self.user_id,self.email,self.pwdhash,self.create_date,self.active)

        def is_authenticated(self):
            return True

        def is_active(self):
            return True

        def is_anonymous(self):
            return False

        def get_id(self):
            return unicode(self.user_id) 

        def __init__(self, email, password):
            self.email = email.lower()
            self.set_password(password)
            self.create_date = datetime.utcnow()
            self.active = 0

        def set_password(self, password):
            self.pwdhash = generate_password_hash(password)

        def check_password(self, password):
            return check_password_hash(self.pwdhash, password)

    class Team(db.Model):
        __tablename__ = 'teams'
        team_id = db.Column(db.Integer, primary_key=True)
        teamname = db.Column(db.String(96), unique=True, nullable=False)
        sport = db.Column(db.String(32))
        age = db.Column(db.Integer())
        create_date = db.Column(db.Date)
        active = db.Column(db.Integer)
        user = db.relationship('User', secondary=teams_users_map, backref='teams')
        player = db.relationship('Player', secondary=teams_players_map, backref='teams')

        def __repr__(self):
            return "TeamID: %r\nTeamName: %r\nSport: %r\nAge: %r\nCreate Date: %r\nActive: %r\n\n" % (self.team_id,self.teamname,self.sport,self.age,self.create_date,self.active)

    class Player(db.Model):
        __tablename__ = 'players'
        player_id = db.Column(db.Integer, primary_key=True)
        playername = db.Column(db.String(120), index=True, unique=True, nullable=False)
        address = db.Column(db.String(120))
        city = db.Column(db.String(48))
        state = db.Column(db.String(2))
        zip = db.Column(db.String(5))
        dob = db.Column(db.String(10))
        position = db.relationship("Position_bb", uselist=False, backref="players")

        def __repr__(self):
            return "PlayerID: %r\nPlayerName: %r\nAddress: %r\nCity: %r\nState: %r\nZip: %r\nDOB: %r\n" % (self.player_id,self.playername,self.address,self.city,self.state,self.zip,self.dob)

    class Position_bb(db.Model):
        __tablename__ = 'positions_bb'
        position_id = db.Column(db.Integer, primary_key=True)
        p = db.Column(db.Integer(), default=5, nullable=False)
        c = db.Column(db.Integer(), default=5, nullable=False)
        fb = db.Column(db.Integer(), default=5, nullable=False)
        sb = db.Column(db.Integer(), default=5, nullable=False)
        tb = db.Column(db.Integer(), default=5, nullable=False)
        ss = db.Column(db.Integer(), default=5, nullable=False)
        lf = db.Column(db.Integer(), default=5, nullable=False)
        cf = db.Column(db.Integer(), default=5, nullable=False)
        rf = db.Column(db.Integer(), default=5, nullable=False)
        bench = db.Column(db.Integer(), default=5, nullable=False)
        available = db.Column(db.Integer(), default=5, nullable=False)
        fk_player = db.Column(db.Integer, db.ForeignKey('players.player_id'))

        def __repr__(self):
            return "PositionID: %r\nP: %r\nC: %r\n1B: %r\n2B: %r\n3B: %r\nSS: %r\nLF: %r\nCF: %r\nRF: %r\nBench: %r\nAvailable: %r\n" %(self.position_id,self.p,self.p,self.fb,self.sb,self.tb,self.ss,self.lf,self.cf,self.rf,self.bench,self.available)

0 个答案:

没有答案