1

I'm building a web app in Flask that involves some SQLAlchemy. I have a function "get_team()" that is driving me bonkers.

    def get_team(playerlist)
        cond = and_(*[Team.users.contains(p) for p in playerlist ])
        q = Team.query.filter(cond)
         ...

I keep getting the error: "AttributeError: 'unicode' object has no attribute '_sa_instance_state'". Here's what the models look like:


class Team(db.Model):                                                            
    __tablename__ = 'teams'                                                      

    id = db.Column(db.Integer, primary_key=True)                                 
    users = association_proxy("user_associations", "user", creator=lambda u: Teaming(user=u))

    def __repr__(self):                                                          
        s = ""                                                                   
        for u in self.users:                                                     
            s = s + u.username + ", "                                            

        return "Team {tid}: {users_string}".format(tid = self.id, users_string=s)

class Teaming(db.Model):                                                         
    __tablename__ = 'teaming'                                                    

    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True) 
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) 

    user = db.relationship("User", backref="team_associations")                  
    team = db.relationship("Team", backref="user_associations")                  

    def __repr__(self):                                                          
        return "".format(uid = self.user_id, tid = self.team_id)

class User(UserMixin, db.Model):                                                 
    __tablename__ = 'users'                                                      

    id = db.Column(db.Integer, primary_key=True)                                 

    email = db.Column(db.String(64), unique=True, index=True)                    
    username = db.Column(db.String(64), unique=True, index=True)                 
    password_hash = db.Column(db.String(128))                                    
    confirmed = db.Column(db.Boolean, default=False)                             

    teams = association_proxy("team_associations", "team", creator = lambda t: Teaming(team=t))

Any direction would be greatly appreciated!

1 Answer 1

1

Most likely cause is that playerlist is not a list of User instances, but some strings (maybe names). contains works only on model instances. If you would like to work with other attributes, then use any.

def get_team_of_players(playerlist):
    cond = and_(*[Team.users.contains(p) for p in playerlist])
    q = Team.query.filter(cond)
    return q

p1, p2 = db.session.query(User).get(1), db.session.query(User).get(2)
q = get_team_of_players([p1, p2]).all()


def get_team_of_usernames(usernames):
    cond = and_(*[Team.users.any(User.username == p) for p in usernames])
    q = Team.query.filter(cond)
    return q

p1, p2 = 'user1', 'user2'
q = get_team_of_usernames([p1, p2]).all()
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.