分类目录归档:python

那些python陪伴我的日子

30 ORM响应页面数据

前后端分离的场景下,用户访问的是前端服务器,后端开发的接口是给前端用的,这个要谨记。

了解一下前后端不分离的模式

@student.get("/index.html")
async def getAllStudent():
    students = await Student.all()
    return students

这里直接返回的话,返回的是json的数据,可以在接口文档中看的很清楚。

前后端不分离的话,我们需要将数据嵌入前端中,然后返回给用户。

# 需要导入jinja2
from fastapi.templating import Jinja2Templates
from fastapi import Request

@students.get('/students')
async def get_all_students(request: Request):  # 这里必须携带Request的实例
    all_students = await Student.all()
    templates = Jinja2Templates(directory=r".\chapter3\学习ORM\apis\templates")

    return templates.TemplateResponse(
        "index.html",{            # 模板文件写这里
        "request": request,
        "students": all_students  #传递的参数写这里
        }
    )

模板文件需要在合适的位置编辑好,数据插入的位置,类似这样

<html>
  <body>
    <ul>
      {% for student in students %}
          <li>姓名:{{ student.name }}, 学号:{{ student.student_number }}</li>
      {% endfor %}
    </ul>
  </body>
</html>

再尝试访问,就可以看到返回的渲染后的页面了
file
然后 老师讲了一下bootstrap的一些用法,看看就好。

29 选课系统之ORM查询操作

tortoise ORM具体操作

29 选课系统之ORM查询操作

学生选课为例

先手动在class表中添加几条记录,用insert也好、用pycharm的数据库插件也好、用navicat也好

id 班级
13 计算机1班
14 计算机2班
15 软件1班

teacher表也添加几条记录

id name pwd tno
11 xhs 123 1
22 dhs 456 2

course表也添加几条记录

id name teacher_id
6 python开发 11
7 操作系统原理 22

student也添加

id name pwd sno class
1 tom tom666 202501 13
2 jerry jerry666 202502 14
3 tafei tafei666 202503 14

student_course表添加

student_id course_id
2 6
2 7
3 7
  • 查询所有学生

在students_api.py文件中编辑,先导入我们定义的模型:

from mymodels import *

然后在查询所有学生的函数(可能是get_all_students)下面,进行tortoise ROM的查询操作:

students = Student.all()
# 查询所有记录,students是queryset的数据类型,可以遍历,
# 一张表相当于一个类,一条记录相当于一个对象的实例化
# 遍历的时候需要注意,不可以直接 for student in students: pass
# 这里需要变成异步任务,不然会报错
函数名前加上async,Student.all()前面加上await
async def get_all_students():
    students = await Student.all()
    ... ...

过滤查询filter,返回的还是QuerySet,就算其中只有一个元素,也得按照元素位置取值或者遍历

# students = await Student.filter(name="tom")
students = await Student.filter(class_id=13)

过滤查询get,返回模型类对象,不用遍历

student = await Student.get(class_id=13)
# 可以直接使用对象的方法调用属性
print(student.name)

模糊查询

  • 字段+两个下划线+查询符号
    students = await Student.filter(sno__gt=202502)          # sno__gt这里表示大于的意思
    students = await Student.filter(sno__in=[202502,202503]) # 筛选其中的两个
    students = await Student.filter(sno__range=[202501,202503])  # 范围查询

value查询

students = await Student.all().values("name")
students = await Student.filter(sno__gt=202502).values("name","sno")
# 这里就相当于只返回name字段的结果,相当于select name from xxx;
# 返回结果是字典组成的列表,返回多少条记录,该列表中就有多少个字典,
# 字典的格式和你查询的字段相对应,比如[{'name': 'xhs'}, {'name': 'dhs'}]或者
# [{'name': 'xhs', 'sno': 2}, {'name': 'dhs', 'sno': 3}]