概念引入
ORM(objects relationship mapping): 对象关系映射;
objects: 管理器,默认模型的属性;
1.数据增加中间表(即自己需要管理的表)
举例操作:创建一张学生表,包含名字,性别,年龄,创立日期以及更新日期;
- a:在django-admin startproject app . 或者 python manage.py startapp app之后即可看见工程中有app文件,其中有一个model.py文件,进入即可。
- b:创建类以及创建表名字,需要导入model模块
from django.db import models # Create your models here. class Student(models.Model): s_name = models.CharField(max_length=10,unique=True) s_age = models.IntegerField(default=20) s_gender = models.BooleanField(default=0) create_time = models.DateTimeField(auto_now_add=True) # auto_now_add 创建时,默认字段赋值为最新的事件 # create_time = models.DateField updata_time = models.DateTimeField(auto_now=True) # 修改数据是,自动赋值为更新字段时 的时间。 math = models.DecimalField(max_digits=3,decimal_places=1,null=True) wuli = models.DecimalField(max_digits=3,decimal_places=1,null=True) class Meta: db_table = 'student'
- c:在pycharm终端中执行两条迁移命令,即可在数据库中创建表;
- a:进入url.py文件,在urlpatterns中增加路径同时导入相应模块。
增加添加学生模块:模块导入: from django.contrib import admin from django.urls import path from app import views
# https://120.0.0.1:8080/add_stu/ 访问路由即可插入学生信息 # 增加学生信息 path('add_stu/',views.add_stu)
b:进入views.py文件中导入模块以及写入相应函数方法
模块导入:from django.shortcuts import render from django.http import HttpResponse # Create your viewshere. from app.models import Student
写入添加学生方法:
def add_stu(request): #实现插入学生信息,第一种方式; Student.objects.create(s_name='小明') #实现插入学生信息,第二种方式,使用对象的方式进行添加学生信息。 def add_stu(request): stu = Student() stu.s_name = 'lorry' stu.s_age = 26 stu.s_gender = 1 stu.save() return HttpResponse('创建学生成功')
3.数据库的删操作
- a:进入url.py文件,在urlpatterns中增加路由路径。
#删除学生信息 path('del_stu/',views.del_stu),
- b:进入views.py文件中导入模块以及写入相应函数方法
模块导入:def del_stu(requset): #实现删除 #1.获取删除的对象,filter(条件) #2.实现删除方法,delete() Student.objects.filter(id=3).delete() return HttpResponse('删除学生成功')
4.数据库的更新操作
- a:进入url.py文件,在urlpatterns中增加路径。
更新学生 path('up_stu/',views.up_stu),
- b:进入views.py文件中导入模块以及写入相应函数方法
模块导入:- 更新的第一种方法:
- 说明:
- 1.获取更新的数据,filter(条件)
- 2.实现更新方法,update()
def up_stu(requset): #Student.objects.filter(id=2).update(s_name='lorry')
- 更新的第二种方式,即可更新时间字段
def up_stu(requset): #更新的第二种方式,即可更新时间字段 stu = Student.objects.filter(id=2).first() stu.s_name = 'lorrybz' stu.save() return HttpResponse('更新学生成功')
5.数据库的查询操作
- a:进入url.py文件,在urlpatterns中增加路径。
#查询学生 path('sel_stu/',views.sel_stu),
- b:进入views.py文件中导入模块以及写入相应函数方法
######查询学生#导入模块 from django.db.models import Avg, Max, Min, Sum, Count, Q, F def sel_stu(requset): # 查询学生信息 # 查询所有的学生信息 stus = Student.objects.all() for stu in stus: print(stu.s_name) print(stu.s_gender)
- 使用过滤器查询学生fillter和git
# 查询id=2的学生,fillter # 若是条件不成立不会报错,返回值为空 stu = Student.objects.filter(id=2).first() print(stu.s_gender) # 1.取唯一的一个对象 # 2.get(条件必须成立),若是条件不成立会报错 stu = Student.objects.get(id=2) print(stu)
- 过滤出满足条件和不满条件的fillter和exclude。
# 过滤出不满足条件的信息上面是满足条件,下面是不满足条件的 stus = Student.objects.filter(s_gender=1) print(stus) stus = Student.objects.exclude(s_gender=0) print(stus)
- 排序:默认是升序,在id或者筛选条件前加 ‘-’即可将序
#排序order_by stus = Student.objects.order_by('-id') print(stus)
- 取出对象中的某个字段
stus = Student.objects.all().values('s_name','s_age') print(stus) stus = Student.objects.all().values() print(stus)
- 判断查询结果是否存在
a = Student.objects.filter(s_name='校长').exists() print(a)
对过滤的条件进行计数,有两种方法
方法1: stus = Student.objects.filter(s_gender=1) print(len(stus)) 方法2: count = Student.objects.filter(s_gender=1).count() print(count) stus = Student.objects.filter(s_name='lorrybz').first() print(stus)
第二大类模糊查询contains
##contains # 字段——运算符 stus = Student.objects.filter(s_name__contains='小') print(stus) #like '小%' '%明' # startwith endwith stus = Student.objects.filter(s_name__startswith='小') print(stus) stus = Student.objects.filter(s_name__endswith='z') print(stus) # sql where id in (12345679) # 模糊判断 stus = Student.objects.filter(id__in=[1,2,3,4,5]) print(stus) stus = Student.objects.filter(pk__in=[1,2,3,4,5]) print(stus)
- 比较运算符
#gt >;gte >=; lt <; lte <=;#并且操作 stus = Student.objects.filter(s_age__gte=18,s_age__lt=20) print(stus) stus = Student.objects.filter(s_age__gte=18).filter(s_age__lt=20) print(stus)
- 聚合函数 avg max min sum count
- 语法: 模型名.objects.all().aggregate(Sum(字段))
# 聚合函数 avg max min sum count age_avg = Student.objects.all().aggregate(Avg('s_age')) print(age_avg) sum_avg = Student.objects.all().aggregate(Sum('s_age')) print(sum_avg) max_avg = Student.objects.all().aggregate(Max('s_age')) print(max_avg) min_avg = Student.objects.all().aggregate(Min('s_age')) print(min_avg)
- 语法: 模型名.objects.all().aggregate(Sum(字段))
与或非的计算
- 要点(1)Q将条件包起来进行与或非函数的比较
- 要点(2)与1: Q(条件1), Q(条件2)
- 要点(3)与2: Q(条件1) & Q(条件2) ;: Q(条件1) and Q(条件2) ;
- 要点(4)或: Q(条件1) | Q(条件2) ;Q(条件1) or Q(条件2)
- 要点(5)非: ~Q(条件1)
- 要点(6)用于比较两个字段,可使用+,-符号
模型名.objects.filter(wuli__gt=F(‘math’)-10)
#查询年龄大于等于18 且 小于20 stus = Student.objects.filter(s_age__gte=18, s_age__lt=20) print(stus) # ,& 和and 是且的操作 or 或者, 查询年龄大于等于18 或者 小于等20 stus = Student.objects.filter(Q(s_age__gte=18) | Q(s_age__lte=20)) print(stus) stus = Student.objects.filter(~Q(s_age__gt=18)) print(stus) #查询物理成绩大于数学成绩的学生 stus = Student.objects.all() for stu in stus: if stu.wuli > stu.math: print(stu.s_name) stus = Student.objects.filter(wuli__gt=F('math')+10).first() print(stus.s_name)
- 最后一句通用的:
return HttpResponse('查询所有学生信息')