【问题标题】:Undefined join condition between parent/child tables父/子表之间未定义的连接条件
【发布时间】:2014-09-15 11:03:06
【问题描述】:

这是一个基本待办事项应用程序的模型,用户可以在其中创建一个包含任务的任务列表:

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' 表达。如果存在“辅助”,则需要“辅助连接” 好吧。

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

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

...返回:

InvalidRequestError:一个或多个映射器未能初始化 - 不能 继续初始化其他映射器。

模型有什么问题?

我在 [relationship][1] 文档和 SO 上搜索了解释,但无济于事。

【问题讨论】:

    标签: join orm foreign-key-relationship flask-sqlalchemy


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2022-01-11
      • 2018-07-17
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多