Django 过滤
创建项目 test 并完成项目配置后,创建应用 student ,进入 models.py ,建立模型,输入代码如下:
from django.db import models
from grade.models import Grade
class Student(models.Model):
stu_name = models.CharField(max_length=10)
stu_sex = models.BooleanField()
stu_birth = models.DateField()
stu_create_time = models.DateTimeField(auto_now_add=True)
stu_operate_time = models.DateTimeField(auto_now=True)
stu_chinese = models.DecimalField(max_digits=3, decimal_places=1)
stu_math = models.DecimalField(max_digits=3, decimal_places=1)
g = models.ForeignKey(Grade, null=True) # 设置外键
class Meta:
db_table = 'stu'
class StudentInfo(models.Model):
stu_addr = models.CharField(max_length=20)
stu_age = models.IntegerField()
stu = models.OneToOneField(Student, on_delete=models.CASCADE) # 一对一关系
class Meta:
db_table = 'stu_info'
所谓过滤,即将我们需要的信息提取出来,展示到前端页面,我们在 templates 文件夹下建立 sel_student.html 文件,代码如下:
{% for stu in stus %}
id: {{ stu.stu_id }}
姓名:{{ stu.stu_name }}
生日:{{ stu.stu_birth }}
电话:{{ stu.stu_tel }}
<br>
{% endfor %}
在 views.py 添加代码如下:
from django.db.models import F, Q
from django.shortcuts import render
from stu.models import Student
def select_stu(request):
# 查询数据
# stus = Student.objects.all()
# 查询所有女生
# stus = Student.objects.get(stu_sex=0)
# stus = Student.objects.filter(stu_sex=0)
# return render(request, 'sel_stu.html', {'stus': stus})
# 查询id从大到小的排序
# stus = Student.objects.all().order_by('-id')
# 查询id最大的一条数据
# stus = Student.objects.all().order_by('-id').first()
# 查询id最小的一条数据
# stus = Student.objects.all().order_by('-id').last()
# 获取男生的数据个数
# stus = Student.objects.filter(stu_sex=True).count()
# print(stus)
# 查询所有80后女生姓名
# stus = Student.objects.filter(stu_sex=False).\
# filter(stu_birth__gte='1980-01-01').\
# filter(stu_birth__lt='1990-01-01')
# 查询姓李的数据
# stus = Student.objects.filter(stu_name__startswith='李')
# 查询姓姓名以华结束的数据
# stus = Student.objects.filter(stu_name__endswith='华')
# 姓名中包含李的数据
# stus = Student.objects.filter(stu_name__contains='李')
# 判断是否存在张三
# stus = Student.objects.filter(stu_name='张三').exists()
# print(stus)
# 获取指定多个id的值
# ids = [1, 2]
# stus = Student.objects.filter(id__in=ids)
# 查询语文成绩大于等于数学成绩的学生
# stus = Student.objects.filter(stu_chinese__gte=F('stu_math'))
# 查询语文成绩超过数学成绩10分的学生
# stus = Student.objects.filter(stu_chinese__gte=F('stu_math') + 10)
# 查询学生姓名不叫李白的,或者语文成绩大于80分的学生
# ~代表非
stus = Student.objects.filter(~Q(stu_name='李白') | Q(stu_chinese__gt=80))
# 返回给前端
return render(request, 'sel_stu.html', {'stus': stus})
以上展示了一些常用的过滤语句,下面罗列一些知识点:
objects 对象
通过 模型名.objects 来实现数据的 CRUD 操作获取所有学生
MySQL语句表示方式:select * from student
Django语句表示方式:模型名.objects.all()常用词汇:
get:返回一个满足条件的对象,没有满足条件的则直接报DoesNotExit的异常,如果查询结果有多个数据的话,就报MulitiObjectsReturned
filter:返回所有满足条件的对象
first():返回第一条数据
last():返回最后一条数据
count():求和
delete():删除数据
gt / gte:大于 大于等于
lt / lte:小于 小于等于
错误页面展示
在用户访问页面过程中,时常会遇到页面报错,如何将页面报错友好的展示给用户,就是我们下面要说的。
错误页面分两种,一种是 404错误页面,404页面是客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应,且不知道原因所返回的页面。一种是 500错误页面,造成500错误原因多种多样,这里就不一一赘述。
首先,我们在 templates 文件夹下创建 404.html 和 500.html 两个文件,在 404.html 添加代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404错误页面</title>
</head>
<body>
<h1>我是400错误页面</h1>
</body>
</html>
在 500.html 添加代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>500错误页面</title>
</head>
<body>
<h1>我是500错误页面</h1>
</body>
</html>
在 student 目录下 views.py 添加代码如下:
def page_not_found(request):
return render(request, '404.html')
def server_error(request):
return render(request, '500.html')