1.关联关系 —> 多对多

定义模型:

引入SQLALchemy

1
2
3
from flask_sqlalchemy import SQLALchemy

db = SQLALchemy

创建中间表

1
2
3
sc = db.Table('sc',
db.Column('s_id', db.Integer, db.ForeignKey('student.s_id'), primary_key=True),
db.Column('c_id'), db.Integer, db.ForeignKey('course.c_id'), primary_key=True)

创建学生类Student

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Student(db.Model):

s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
s_name = db.Column(db.String(16), unique=True)
s_age = db.Column(db.Integer, defauult=18)
s_g = db.Column(db.Integer, db.Foreignkey('grade.g_id'), nullable=True)

__tablename__ = 'student'

def __init__(self, name, age):

self.s_name = name
self.s_age = age
self.s_g = None

创建课程表的模型, Course类

1
2
3
4
5
6
7
8
9
10
11
12
13
class Course(db.Model):

c_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
c_name = db.Column(db.String(20), unique=True)
students = db.relationship('Student',
secondary=sc,
backref='cou')

__tablename__ = 'courses'

def __init__(self, name):

self.s_name = name

sc表由db.Table声明,我们不需要关心这张表,因为这张表将会由SQLAlchemy接管,它唯一的作用是作为students表和courses表关联表,所以必须在db.relationship()中指出sencondary关联表参数。lazy是指查询时的惰性求值的方式,这里有详细的参数说明,而db.backref是声明反向身份代理,其中的lazy参数是指明反向查询的惰性求值方式.

2. 添加学生和课程之间的关系

通过页面中传递学生的id和课程的id,分别获取学生的对象和课程的对象,在使用关联关系append去添加学生对象,并且add以后再commit后,就可以在中间表sc中查看到新增的关联关系了。

1
2
3
4
5
6
7
8
9
userid = request.form.get('userid')
courseid = request.form.get('courseid')

stu = Student.query.get(userid)
cou = Course.query.get(courseid)

cou.students.append(stu)
db.session.add(cou)
db.session.commit()

3. 删除学生和课程之间的关系

通过页面获取传递的学生的id和课程的id,分别获取学生对象和课程对象,在使用关联关系remove去删除学生对象,并commit将事务提交到数据库中

1
2
3
4
5
stu = Student.query.get(s_id)
cou = Course.query.get(c_id)

cou.students.remove(stu)
db.session.commit()

4. 通过课程查询学生的信息

以下定义在课程course的模型中,所以通过课程查询学生的信息,语法为课程的对象.studengs。如果知道学生的信息反过来找课程的信息,则使用backref的反向关联去查询,语语法为学生的对象.cou(反向)

students = db.relationship(‘Student’,secondary=sc,backref=’cou’)

1
2
cou = Course.query.get(3)
stus = cou.students

5. 通过学生去查询课程的信息

1
2
stu = Student.query.get(id)
cous = stu.cou

6.开发, 页面调试工具debugtoolbar

1.1安装
1
pip install flask-debugtoolbar
1.2配置
1
2
3
4
5
6
7
8
9
10
11
from flask import Flask

from flask_debugtoolbar import DebugToolbarExtension

app = Flask(__name__)

app.debug = True

app.config['SECRET_KEY'] = '<replace with a secret key>'

toolbar = DebugToolbarExtension(app)
2. restful

Flask-RESTful 提供的最主要的基础就是资源(resources)。资源(Resources)是构建在 Flask 可拔插视图 之上,只要在你的资源(resource)上定义方法就能够容易地访问多个 HTTP 方法

官网上描述了一个最简单的restful风格的api,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask
from flask.ext import restful

app = Flask(__name__)
api = restful.Api(app)

class HelloWorld(restful.Resource):
def get(self):
return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
app.run(debug=True)
2.1安装
1
pip install flask_restful
2.2配置

在create_app()获取Flask(name)对象中,设置如下配置

1
2
3
4
5
from flask_restful import Api

api = Api()

api.init_app(app=app)

在views中需要引入配置的api还有Resource

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 导入包和restful中的Api对象
from flask_restful import Resource
from tuils.functions import api

# 定义类, 启动包含了对数据处理的GET, POST, PATCH, PUT, DELETE请求
class CreateCourse(Resource):

def get(self, id):
course = Course.query.get(id)
return course.to_dict()
def post(self):

courses = ['大学英语', '大学物理', '线性代数', '高数', '大学语文', '马克思主义', 'C++', '课外拓展']
course_list = []
for course in courses:
c = Course()
c.c_name = course
course_list.append(c)
db.session.add_all(course_list)
db.session.commit()

courses = Course.query.all()
return [course.to_dict() for course in courses]

def patch(self, id):
c_name = request.form.get('c_name')
course = Course.query.get(id)
course.c_name = c_name
db.session.commit()
return {'code':200, 'data': course.to_dict(), 'msg': '请求成功'}

def delete(self, id):
course = Course.query.get(id)
db.session.delete(course)
db.seesion.commit()
return {'code': 200, 'msg': '删除成功'}

# 绑定处理url
api.add_resource(CreateCourse, '/api/course/<int:id>/', '/api/course/')
2.3 端点(Endpoints)

在一个 API 中,你的资源可以通过多个 URLs 访问。你可以把多个 URLs 传给 Api 对象的 Api.add_resource() 方法。每一个 URL 都能访问到你的 Resource

如:

1
api.add_resource(CreateCourse, '/api/course/<int:id>/', '/api/course/')
2.4 返回响应

Flask-RESTful 支持视图方法多种类型的返回值。同 Flask 一样,你可以返回任一迭代器,它将会被转换成一个包含原始 Flask 响应对象的响应。Flask-RESTful 也支持使用多个返回值来设置响应代码和响应头

如:

1
2
3
def get(self, id):
course = Course.query.get(id)
return course.to_dict(), 200

最后更新: 2018年06月15日 17:01

原始链接: http://yoursite.com/2018/06/15/flask多对多关系/

× 请我吃糖~
打赏二维码