博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6.ORM与SQLAlchemy (2) - 模型关系与引用
阅读量:6037 次
发布时间:2019-06-20

本文共 3306 字,大约阅读时间需要 11 分钟。

承接上文,我们的Q&A demo,除了用户表,还需要存储所有问题内容的表questions_info和存储所有评论的表comments_info,并且都和users_info通过外键来关联。我们不排除后续需要更多表的可能性,把所有模型和视图函数写在一起看着也太混乱了!为此,我们新建一个models.py,把三个模型都放在这里。


由于是新建的models.py文件,我们同样要先在开头生成一个名为dbSQLAlchemy对象:

from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()

前文中我们给SQLAlchemy传入了Flask对象app作为参数,这里是不是也要从视图函数文件HarpQA.py导入那个app并传进去呢?并不可以,因为HarpQA.py也要使用到db(如db.session),这样就产生了循环引用,所以在这里不能传入app,而是回到HarpQA.py,使用db.init_app(app)appdb绑定,避免了循环引用。


users_info表(Users模型)代码如下:

class Users(db.Model):    __tablename__ = 'users_info'    id = db.Column(db.Integer, primary_key=True, autoincrement=True)    username = db.Column(db.String(32), nullable=False)    password = db.Column(db.String(100), nullable=False)    register_time = db.Column(db.DateTime, nullable=False, default=datetime.now())    # 我们新增了一个avatar_path字段来存用户头像图片文件的路径    avatar_path = db.Column(db.String(256), nullable=False, default='images/doraemon.jpg')

questions_info表(Questions模型)代码如下:

class Questions(db.Model):    __tablename__ = 'questions_info'    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)    author_id = db.Column(db.Integer, db.ForeignKey('users_info.id'))    create_time = db.Column(db.DateTime, nullable=False, default=datetime.now())    author = db.relationship('Users', backref=db.backref('questions', order_by=create_time.desc()))

这个表存储所有问题的标题、内容、创建时间、作者ID,作者ID通过外键与用户表的ID关联,方式也很简单,在db.Column中用db.ForeignKey('users_info.id')作为参数即可。

再看最后一条语句:

author = db.relationship('Users', backref=db.backref('questions', order_by=create_time.desc()))

db.relationship会自动找到两个表的外键,建立QuestionsUsers的关系,此时对于任意一个Questions对象question,通过question.author就可获得这个question的作者对应的Users对象,例如获取id1的问题的作者姓名:

question = Questions.query.filter(Questions.id == 1).first()author_name = question.author.username

db.relationship的第二个参数backref=db.backref('questions', order_by=create_time.desc())则建立了一个反向引用,这样我们不仅可以使用question.author,还可以使用author.questions获得一个作者所有的问题,并通过order_by=create_time.desc()按创建时间倒序排列(网页的内容按时间倒序排列),返回的是一个Questions对象的列表,可以遍历它获取每个对象,如获取作者Harp的所有问题的title

author = Users.query.filter(Users.username == 'Harp').first()for question in author.questions:    print(question.title)

同理,comments_info表(Comments模型)代码如下:

class Comments(db.Model):    __tablename__ = 'comments_info'    id = db.Column(db.Integer, primary_key=True, autoincrement=True)    content = db.Column(db.TEXT, nullable=False)    question_id = db.Column(db.Integer, db.ForeignKey('questions_info.id'))    author_id = db.Column(db.Integer, db.ForeignKey('users_info.id'))    create_time = db.Column(db.DateTime, nullable=False, default=datetime.now())    author = db.relationship('Users', backref=db.backref('comments'))    question = db.relationship('Questions', backref=db.backref('comments', order_by=create_time.desc()))

HarpQA.py中,我们要从models.py导入db所有的模型,注意因为上下文的关系,我们这里用with语句把app推入栈中:

from flask import Flask, render_templatefrom models import db, Users, Questions, Commentsimport configapp = Flask(__name__)app.config.from_object(config)db.init_app(app)with app.test_request_context():    db.drop_all()    db.create_all()@app.route('/')def index():    return render_template('home.html')if __name__ == '__main__':    app.run()

运行脚本,此时数据库已经把三张表都建立好了:

clipboard.png

转载地址:http://aplhx.baihongyu.com/

你可能感兴趣的文章
Column 'parent_id' specified twice
查看>>
了解互联网活动咨讯
查看>>
linux usb安装介质制作 create-a-usb-stick-on-windows
查看>>
Oracle查前几条记录方法
查看>>
使用delphi 开发 web(一) webbroke 简介
查看>>
移动终端网页游戏移植研发框架【客户端战斗系统】
查看>>
Hammock for REST
查看>>
修正 THashedStringList 在插入和 PutObject 时的速度缺陷
查看>>
线程间通信
查看>>
Mysql存储引擎
查看>>
HDU-4318 Power transmission 模型转化
查看>>
asp.net实现视频在线播放
查看>>
理解 JavaScript 闭包
查看>>
Eclipse中如何更改字体大小?
查看>>
Java学习笔记(7)——输入输出
查看>>
wcf 基础教程 契约 Contract 数据契约DataContract序列化前身 XmlSerializer xml序列化
查看>>
mysql主从备份、主从切换
查看>>
Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案...
查看>>
每日英语:China Seeks to Calm Anxiety Over Rice
查看>>
C++中struct和class的区别 [转]
查看>>