2016-01-12 35 views
2

我在燒瓶應用程序中的兩個模型之間建立一對一關係時遇到了一些困難。我有兩個模型Employee和`照片'。員工只有一張相關照片,反之亦然。即使SQLAlchemy模型指定了外鍵,關係上的NoForeignKey錯誤

這是我在我的models.py文件中的代碼:我已經按照這裏SQL Alchemy simple relationships發現SQL鍊金術文件上的指示

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') 

。我不斷遇到的錯誤如下所示:

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

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) 
+0

感謝您的幫助davidism。你的解決方案有效,但爲什麼你的實現不同於sql鍊金術文檔?在這個頁面http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-one孩子類引用自己,這就是爲什麼我有照片引用本身。 –

+0

@DanRubio在文檔中看起來像一個錯字。 – davidism