flask 模型一对多个人理解
在modle中创建两个模型表
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
u_name = db.Column(db.String(10), unique=True)
posts = db.relationship('Dongtai',backref='user',lazy='dynamic')
class Dongtai(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
body = db.Column(db.String(140),unique=True)
u_id = db.Column(db.Integer,db.ForeignKey('user.id'))
分别是用户和动态模型
之间进行了关联 注意进行关联需要外链配合使用,只有一边进行关联会出错
一对多
一般来说自己做查询操作,比如我想要知道一个用户发的动态,那么需要先查询用户信息,然后通过用户信息查询用户的动态
但是flask-sqlalchemy通过一个关联属性可以只需要查询用户即可得到所发的动态
@app.route('/xxx/') def get_query(): # 其他属性也行 id u = User.query.filter(u_name="查询的用户").first() bodys = u.posts return render_template('xxxx.html',bodys=bodys) # 网页渲染 {% for body in bodys %} {{ body.body }}<br> {{ body.u_id }}<br> {% endfor %}
多对一
多对一的查询由于有了反向代理
relationship('Dongtai',backref='user',lazy='dynamic')
可以通过
d = Dongtai.query.first() print(d.user.u_name)
直接询问动态模型进行查询,通过
ralationship("Dongtai",backref='user',lazy='dynamic') # 注意反向代理的backref 名称
通过反向关联的名称表可以得到user表中的属性
更新一下,
增加两个模型作为添加数据实验
python manage.py shell # 进入shell 模式 进行数据添加
导入模型和db
在已有的用户数据中提取一个id为3的
做一个用户动态的实例
这里貌似有一个坑点,不知道其他人和我相同不?
你不能直接 p.user_id = u 用户实例 必须要使用 u.id 才能在之后的commit()中保存,不然会出现以下错误
db.session.add(p)
db.session.commit() 保存即可,在数据库中post表中存在数据
当然除了这个还有另一种,比如在 用一个用户实例 u
使用关系 进行append 添加 p1动态 p1的user_id 则设置为u实例的 id 3
在将 动态p1 加入数据库 保存
数据库中也能显示出 post表 user_id为3的动态
如果需要查看用户所拥有的post,因为在用户表中设置了关联,所以使用 以下进行查看 ,但是注意,因为关联表中设置了 lazy = 'dynamic' 懒加载
前一份u.posts 是指一个对象basequery,还可以对该对象进行一个筛选 比如我在动态表中存储了2条用户id为3的数据
通过筛选动态表中动态id为13的动态, 发现还是属于basequery的对象,还能进行下一步操作
得到一个用户动态的实例 13
如果查看该实例的body属性 根据上面的操作.body
后面一个这是直接将上一个对象进行一个数据加载 变为放在内存中的数据
all 是所有数据,所以需要进行一个循环遍历
for i in u.posts.all(): i.body
如果是first() 则不需要遍历 直接body