Join 父/子表之间未定义的联接条件

Join 父/子表之间未定义的联接条件,join,orm,foreign-key-relationship,flask-sqlalchemy,Join,Orm,Foreign Key Relationship,Flask Sqlalchemy,以下是基本todo应用程序的模型,用户可以在其中创建包含任务的任务列表: from flask.ext.sqlalchemy import SQLAlchemy from allot import db class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String) tasklists = db.relationship('Taskli

以下是基本todo应用程序的模型,用户可以在其中创建包含任务的任务列表:

from flask.ext.sqlalchemy import SQLAlchemy
from allot import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String)

    tasklists = db.relationship('Tasklist', backref='user', lazy='dynamic')
    tasks = db.relationship('Task', backref='user', lazy='dynamic')

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

class Tasklist(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String)
    user_id = db.Column(db.Integer, db.ForeignKey('User.id'))

    tasks = db.relationship('Task', backref='tasklist', lazy='dynamic')

    def __init__(self, title, description, user_id):
        self.title = title
        self.user_id = user_id

class Task(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title= db.Column(db.String)
    user_id = db.Column(db.Integer, db.ForeignKey('User.id'))
    tasklist_id = db.Column(db.Integer, db.ForeignKey('Tasklist.id'))

    def __init__ (self, title, status, user_id):
        self.title = title
        self.user_id = user_id
        self.tasklist_id = tasklist_id
它会生成以下错误:

ArgumentError:无法确定父级/子级之间的联接条件 关系User.tasklists上的表。指定“primaryjoin” 表示如果存在“secondary”,则需要“secondary join” 嗯

在关系中添加primaryjoin参数,如下所示:

tasklists = db.relationship('Tasklist', backref='user', primaryjoin='user.id==Tasklist.user_id', lazy='dynamic')
。。。返回:

InvalidRequestError:一个或多个映射程序未能初始化-无法 继续初始化其他映射程序

这个模型怎么了


我在[relationship][1]文档等中搜索了一个解释,但没有结果。

一种可能是,当您引用外键时,您使用的是大写用户,而实际上需要使用小写的tablename引用。试试这个:

from flask.ext.sqlalchemy import SQLAlchemy
from allot import db

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

    tasklists = db.relationship('Tasklist', backref='user', lazy='dynamic')
    tasks = db.relationship('Task', backref='user', lazy='joined'))

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

class Tasklist(db.Model):
    __tablename__ = 'tasklist'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    tasks = db.relationship('Task', backref='tasklist', lazy='dynamic')

    def __init__(self, title, description, user_id):
        self.title = title
        self.user_id = user_id

class Task(db.Model):
    __tablename__ = 'task'
    id = db.Column(db.Integer, primary_key=True)
    title= db.Column(db.String)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    tasklist_id = db.Column(db.Integer, db.ForeignKey('tasklist.id'))

    def __init__ (self, title, status, user_id):
        self.title = title
        self.user_id = user_id
        self.tasklist_id = tasklist_id