简体   繁体   中英

Association table in flask-sqlalchemy

I want to design such an application which has users and projects, user can be a candidate of projects, and can be chosen as participant of projects. So I use the code below:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True)


class Participate(db.Model):
    __tablename__ = 'participates'
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id'),
                           primary_key=True)
    candidate_id = db.Column(db.Integer, db.ForeignKey('users.id'),
                             primary_key=True)
    participant_id = db.Column(db.Integer, db.ForeignKey('users.id'),
                               primary_key=True)
    candidate_timestamp = db.Column(db.DateTime, default=datetime.utcnow)
    participate_timestamp = db.Column(db.DateTime, default=datetime.utcnow)


class Project(db.Model):
    __tablename__ = 'projects'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    candidates = db.relationship('Participate',
                                 foreign_keys=[Participate.candidate_id],
                                 backref=db.backref('candidate_projects', lazy='joined'),
                                 lazy='dynamic')
    participants = db.relationship('Participate',
                                   foreign_keys=[Participate.participant_id],
                                   backref=db.backref('participate_projects', lazy='joined'),
                                   lazy='dynamic')

then I tried to create some data in shell:

# python manage.py shell
>>> db
<SQLAlchemy engine='mysql://connection_uri?charset=utf8&use_unicode=0'>
>>> Project
<class 'app.models_.Project'>
>>> User
<class 'app.models_.User'>
>>> Participate
<class 'app.models_.Participate'>
>>> jerry = User(username='jerry')

I got this exception:

NoForeignKeysError: Could not determine join condition between parent/child     
tables on relationship Project.candidates - there are no foreign keys linking 
these tables.  Ensure that referencing columns are associated with a ForeignKey 
or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

I'm new to sqlalchemy , what is the right way to design a database like what I want?

The candidate_id and participant_id attributes are User foreign keys. You are setting up relationships with the Project table. You need to move those to the User table and then they'll work.

Then if you need to get all the candidates or participants of a project, you can use these relationships and filter them by the project you are interested in.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM