让我们考虑3个表:
每本书的作者都有一个外键,可以在美国表中,也可以在英国表中。
如何在SQLAlchemy中实现这种外键条件?
我想用一列来处理链接。
到目前为止,我的方法是创建一个抽象类Author
,AmericanAuthor
和BritishAuthor
都从中继承,并且将Book
的外键指向父类
class Author(Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class AmericanAuthor(Author):
__tablename__ = 'american_author'
# some other stuff
class BritishAuthor(Author):
__tablename__ = 'british_author'
# some other stuff
class Book(Model):
__tablename__ = 'book'
title = db.Column(db.String)
author_id = db.Column(db.Integer, db.ForeignKey("author.id"))
它失败并显示以下错误:
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'books.author_id' could not find table 'author' with which to generate a foreign key to target column 'id'
考虑到author
是抽象的,这完全有道理...
答案 0 :(得分:3)
尽管@property
装饰器将在应用程序中工作,但最好使用@hybrid_property
包中的sqlalchemy.ext.hybrid
。这样,您将可以像过滤任何普通属性一样对该属性进行过滤。
您的Book类将如下所示:
class Book(Model):
__tablename__ = 'book'
title = db.Column(db.String)
american_author_id = db.Column(db.Integer, db.ForeignKey("american_author.id"), nullable=True)
british_author_id = db.Column(db.Integer, db.ForeignKey("british_author.id"), nullable=True)
@hybrid_property
def author_id(self):
return self.american_author_id or self.british_author_id
答案 1 :(得分:0)
我认为您不能使用同一列与两个不同的表建立关系。
尝试创建两个不同的列(“ american_author_id”和“ british_author_id”),然后创建一个@property“ author”,以返回不为NULL的作者。
通过这种方式,您可以使用mybook.author