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

语境:

  • 蟒蛇 3.6

  • 烧瓶

  • flask_restful

  • flask_sqlalchemy

Objective:在第一次请求flask restful api之前创建数据库表,避免模型之间的循环依赖。

问题:当我执行第一个请求时,@app.before_first_request按预期调用,但似乎正在考虑包含循环依赖:

File "./app.py", in create_tables

    from models.uf_model import UfModel

File "home/server/models/uf_model.py", in <module>

    from models.cidade_model import CidadeModel

File "/home/server/models/cidade_model.py", in <module>

    from models.uf_model import UfModel

ImportError: cannot import name 'UfModel'

我的问题:即使使用app_context(),如类似问题中所建议的那样,循环依赖也没有解决。如何解决?我究竟做错了什么?


我的代码:


数据库.py:


from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

uf_model.py 一个 uf 有许多 cidades


from db import db, filter_query

from datetime import datetime

from models.cidade_model import CidadeModel


class 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 只有一个 uf


from db import db, filter_query

from datetime import datetime


from models.uf_model import UfModel


class 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 db


app = Flask(__name__)

api = Api(app)


@app.before_first_request

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


慕斯709654
浏览 364回答 1
1回答

白板的微信

你有两种方法来定义模型中的关系,要么引用模型类本身,要么使用类名(添加后者是为了避免这种循环依赖问题)。由于您已经定义了与字符串的关系(例如:uf = db.relationship('UfModel')在 cidade_model.py 中),因此您不再需要导入from models.uf_model import UfModel。uf_model.pyCidadeModel也是如此。您没有使用导入的类,因此您可以删除导入行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python