为了账号安全,请及时绑定邮箱和手机立即绑定

在 Flask 应用程序中为 create_all() 导入模型时的循环依赖

在 Flask 应用程序中为 create_all() 导入模型时的循环依赖

慕斯709654 2022-05-24 16:56:28
语境:蟒蛇 3.6烧瓶flask_restfulflask_sqlalchemyObjective:在第一次请求flask restful api之前创建数据库表,避免模型之间的循环依赖。问题:当我执行第一个请求时,@app.before_first_request按预期调用,但似乎正在考虑包含循环依赖:File "./app.py", in create_tables    from models.uf_model import UfModelFile "home/server/models/uf_model.py", in <module>    from models.cidade_model import CidadeModelFile "/home/server/models/cidade_model.py", in <module>    from models.uf_model import UfModelImportError: cannot import name 'UfModel'我的问题:即使使用app_context(),如类似问题中所建议的那样,循环依赖也没有解决。如何解决?我究竟做错了什么?我的代码:数据库.py:from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()uf_model.py 一个 uf 有许多 cidadesfrom db import db, filter_queryfrom datetime import datetimefrom models.cidade_model import CidadeModelclass UfModel(db.Model):    __tablename__ = 'uf'    unfe_id = db.Column(db.Integer, primary_key=True)    cidades = db.relationship('CidadeModel', backref='unfe_cidades', lazy=True, uselist=False)为了轻松找到cidades给定的所有内容uf,我创建了这种关系。cidade_model.py 一个 cidade 只有一个 uffrom db import db, filter_queryfrom datetime import datetimefrom models.uf_model import UfModelclass CidadeModel(db.Model):    __tablename__ = 'cidade'    cida_id = db.Column(db.Integer, primary_key=True)    cida_unfe_id = db.Column(db.Integer, db.ForeignKey('uf.unfe_id'), nullable=False, index=True)    uf = db.relationship('UfModel')为了轻松找到uf给定的cidade,我创建了这种关系。应用程序.py:from db import dbapp = Flask(__name__)api = Api(app)@app.before_first_requestdef create_tables():    with app.app_context():        from models.uf_model import UfModel        from models.cidade_model import CidadeModel        db.create_all()if __name__ == '__main__':    # some resources api.add_resource    db.init_app(app)
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

你有两种方法来定义模型中的关系,要么引用模型类本身,要么使用类名(添加后者是为了避免这种循环依赖问题)。

由于您已经定义了与字符串的关系(例如:uf = db.relationship('UfModel')在 cidade_model.py 中),因此您不再需要导入from models.uf_model import UfModel。uf_model.pyCidadeModel也是如此。您没有使用导入的类,因此您可以删除导入行。


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 363 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信