1、分开models的目的
- 方便代码管理
- 解决循环引用
2、循环引用的产生
以【python-flask学习笔记】3.1 SQLAlchemy-配置连接与初始化及表映射中的 '实例' 部分的'simiple.py'为例,为了方便代码管理,我们可以把'class Article()' 和 'class User()'两个模型提取出来单独写到一个文件('models.py')里。如下:
'models.py'代码
from simple import db
# 创建映射表
class Article(db.Model): #模型必须继承db.Model
#db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key= True, autoincrement = True)
title = db.Column(db.String(100),nullable = False)
content = db.Column(db.Text, nullable = False)
'simple.py'代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from models import Article
import config
app = Flask(__name__) #引入配置文件
app.config.from_object(config)
db = SQLAlchemy(app)
#db.create_all()
@app.route('/')
def index():
return "hello world"
if __name__ == '__main__':
app.run()
然后运行'simple.py'文件,会出现报错,'ImportError: cannot import name 'Article'',不管是路径还是名称都没错呀,为什么会说不能导入'Article'模块呢?这就是由于产生了循环引用的问题。
这是因为主app文件('simple.py')和models文件('models.py')这两个文件相互引用对方的东西,也就导致了死锁,即循环引用。用图解来解释,如下:
2、循环引用的解决
不让models文件从主app文件中引如db,而是从一个第三方文件中引入。
- (1)新建一个第三方文件('exts.py')
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
- (2)修改'models.py'对'db'的引入,即将'models.py'修改为从'exts.py'文件中引入'db',不再是从'simple.py'文件中引入。
from exts import db
# 创建映射表
class Article(db.Model): #模型必须继承db.Model
#db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key= True, autoincrement = True)
title = db.Column(db.String(100),nullable = False)
content = db.Column(db.Text, nullable = False)
- (3)修改'simple.py'对'db'的引入及对db进行初始化 ('db.init_app(app)')。
from flask import Flask
from models import Article
from exts import db
import config
app = Flask(__name__) #引入配置文件
app.config.from_object(config)
db.init_app(app)
#db.create_all()
@app.route('/')
def index():
return "hello world"
if __name__ == '__main__':
app.run()
注意:第8行 'db.init_app(app)' ,由于'exts.py'文件中没有对'db = SQLAlchemy()'放app这个参数,这里就要对其进行参数初始化,用init_app(app),
如此一来就解决了循环引用的问题。
以上笔记整理自知了课堂黄勇老师讲解的教学视频《Flask框架入门到实战开发》的第三章第11小节内容,不足之处,望不吝赐教!