首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >瓶-SQLAlchemy和第三范式

瓶-SQLAlchemy和第三范式
EN

Stack Overflow用户
提问于 2020-01-04 14:58:54
回答 1查看 184关注 0票数 0

如何实现第三种范式,比如在Flask中有一个独立的Address模型?开玩笑的是,我希望能够从多个不同的模型中使用这个独立的模型。

例如,假设我有两个不同的模型,一个Person和一个Company

代码语言:javascript
复制
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

这太傻了。地址不取决于是个人还是公司。所以我可以做一个独立的模型,像这样:

代码语言:javascript
复制
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)

然后改变我的人形模型如下:

代码语言:javascript
复制
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模型添加一个反向引用:

代码语言:javascript
复制
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的设计。我希望所有的模型,可能需要一个地址,能够使用模型。我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-04 15:48:17

您不应该在relationship上添加Address。该表/模型不知道地址是用于Person还是Company

向父母添加关系:

代码语言:javascript
复制
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 on

relationship与任何普通形式无关,它是为了帮助ORM根据查询结果创建Python,并且不改变数据库的结构。将其添加到地址依赖于backref使属性可用,这是不必要的模糊。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59591867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档