如何实现第三种范式,比如在Flask中有一个独立的Address模型?开玩笑的是,我希望能够从多个不同的模型中使用这个独立的模型。
例如,假设我有两个不同的模型,一个Person和一个Company
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
street_address = db.Column(db.Text, nullable=False)
postal_code = db.Column(db.Text, nullable=False)
city = db.Column(db.Text, nullable=False)
country = db.Column(db.Text, nullable=False)
# ...and so on
class Company(db.Model):
id = db.Column(db.Integer, primary_key=True)
street_address = db.Column(db.Text, nullable=False)
postal_code = db.Column(db.Text, nullable=False)
city = db.Column(db.Text, nullable=False)
country = db.Column(db.Text, nullable=False)
# ...and so on这太傻了。地址不取决于是个人还是公司。所以我可以做一个独立的模型,像这样:
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
street_address = db.Column(db.Text, nullable=False)
postal_code = db.Column(db.Text, nullable=False)
city = db.Column(db.Text, nullable=False)
country = db.Column(db.Text, nullable=False)然后改变我的人形模型如下:
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
address_id = db.Column(db.Integer, db.ForeignKey('address.id'), nullable=False)
# ...and so on然后向我的Address模型添加一个反向引用:
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
street_address = db.Column(db.Text, nullable=False)
postal_code = db.Column(db.Text, nullable=False)
city = db.Column(db.Text, nullable=False)
country = db.Column(db.Text, nullable=False)
person = db.relationship('Person', backref='address', lazy=True) # << NEW!但是,现在我有了一个将Address锁定到Person的设计。我希望所有的模型,可能需要一个地址,能够使用模型。我怎样才能做到这一点?
发布于 2020-01-04 15:48:17
您不应该在relationship上添加Address。该表/模型不知道地址是用于Person还是Company。
向父母添加关系:
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
address_id = db.Column(db.Integer, db.ForeignKey('address.id'), nullable=False)
address = db.relationship(Address)
# ...and so onrelationship与任何普通形式无关,它是为了帮助ORM根据查询结果创建Python,并且不改变数据库的结构。将其添加到地址依赖于backref使属性可用,这是不必要的模糊。
https://stackoverflow.com/questions/59591867
复制相似问题