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表中的属性 




更新一下,

flask 模型一对多个人理解

flask 模型一对多个人理解

 增加两个模型作为添加数据实验

python manage.py shell 


# 进入shell 模式 进行数据添加

导入模型和db

flask 模型一对多个人理解

在已有的用户数据中提取一个id为3的

flask 模型一对多个人理解

做一个用户动态的实例

flask 模型一对多个人理解

这里貌似有一个坑点,不知道其他人和我相同不? 

你不能直接 p.user_id = u  用户实例   必须要使用 u.id 才能在之后的commit()中保存,不然会出现以下错误

flask 模型一对多个人理解

db.session.add(p)

db.session.commit()   保存即可,在数据库中post表中存在数据

flask 模型一对多个人理解

当然除了这个还有另一种,比如在 用一个用户实例  u 

flask 模型一对多个人理解

使用关系 进行append 添加 p1动态   p1的user_id 则设置为u实例的 id 3

在将 动态p1 加入数据库 保存

数据库中也能显示出   post表 user_id为3的动态


如果需要查看用户所拥有的post,因为在用户表中设置了关联,所以使用 以下进行查看 ,但是注意,因为关联表中设置了 lazy = 'dynamic' 懒加载

flask 模型一对多个人理解

前一份u.posts 是指一个对象basequery,还可以对该对象进行一个筛选  比如我在动态表中存储了2条用户id为3的数据 

flask 模型一对多个人理解

flask 模型一对多个人理解

通过筛选动态表中动态id为13的动态, 发现还是属于basequery的对象,还能进行下一步操作 

flask 模型一对多个人理解

 得到一个用户动态的实例 13 

如果查看该实例的body属性   根据上面的操作.body 

flask 模型一对多个人理解

 后面一个这是直接将上一个对象进行一个数据加载  变为放在内存中的数据  

all 是所有数据,所以需要进行一个循环遍历 

for i in u.posts.all():
    i.body

flask 模型一对多个人理解

如果是first() 则不需要遍历     直接body

flask 模型一对多个人理解