尽管SQLAlchemy模型指定了外键

时间:2016-01-12 19:57:38

标签: python flask sqlalchemy flask-sqlalchemy

我在烧瓶应用程序中的两个模型之间建立一对一的关系时遇到了一些困难。我有两个模型Employee和`Photo'。员工只有一张与之相关的照片,反之亦然。

这是我在models.py文件中的代码:

class Employee(db.Model):
    __tablename__ = 'employees'
    id = db.Column(db.Integer, primary_key=True)
    photo = db.relationship("Photo", uselist=False, back_populates='employees')

class Photo(db.Model):
    __tablename__ = 'photos'
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))
    employee = db.relationship('Photo', back_populates='photo')

我已按照此处SQL Alchemy simple relationships中的SQL Alchemy文档说明进行操作。我遇到的错误如下所示:

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

我在这里明确指定了外键employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'))。我不确定我做错了什么。另外,我正在阅读文档,uselist, backref, and back_populates如此相似并没有帮助。

有人可以帮助我吗?非常感谢帮助。

One to One relationship stack overflow question

1 个答案:

答案 0 :(得分:1)

backref会自动将相反关系添加到相关模型中。您可以将db.backref对象传递给它以指定关系的选项。 back_populates告诉SQLAlchemy填充现有的反向关系,而不是创建它。 uselist告诉SQLAlchemy这个关系是否是列表,对于无法自动确定的情况。

在您的示例中,您需要一个关系,其中一个backref是单个项目。

您的代码中有两个拼写错误。首先,back_populates='employees'应该引用'employee',这就是您在相关模型上称为属性的内容。其次,employee = relationship('Photo'指的是错误的模型,它应该与Employee相关。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)
db.engine.echo = True

class Photo(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class Employee(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    photo_id = db.Column(db.ForeignKey(Photo.id))
    photo = db.relationship(Photo, backref=db.backref('employee', uselist=False))

db.create_all()
db.session.add(Employee(photo=Photo()))
db.session.commit()
print(Employee.query.get(1).photo)
相关问题