Django通过Model操作数据库, 不管你数据库的类型是MySql或者Sqlite, Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要会写Model就可以了。
django使用对象关系映射 (Object Relational Mapping, 简称ORM)框架去操控数据库。
ORM(Object Relational Mapping)对象关系映射, 是一种程序技术, 用于实现面向对象编程语言里不同类型系统的数据之间的转换。
一、模型
from django.db import models# Create your models here.
class StudentModel(models.Model):name=models.CharField(max_length=20,unique=True) #唯一的age=models.PositiveIntegerField(default=18)class Meta:db_table='student'verbose_name='学生'verbose_name_plural=verbose_name#重写字符串def __str__(self):return f'{self.name},{self.age}'#重写替换def __repr__(self):return f'{self.name},{self.age}'
二、CRUD的操作
(1) 添加有4种方式
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.# 添加数据
from User.models import StudentModel# 第一种方式
def save_stu(request):# 处理异常try:# 创建对象stu = StudentModel()# 给属性赋值stu.name = '刘芳'stu.age = 20# 保存数据(同步到数据库中)stu.save()except Exception as ex:return HttpResponse('添加失败!')# 返回return HttpResponse('添加成功!')# 第二种方式:
def save_stu2(request):# 处理异常try:# 创建对象stu = StudentModel(name='张三', age=19)# 保存数据(同步到数据库中)stu.save()except Exception as ex:return HttpResponse('添加失败!')# 返回return HttpResponse('添加成功!')# 第三种方式:
def save_stu3(request):# 处理异常try:# 创建对象StudentModel.objects.create(name='王涵', age=30)except Exception as ex:return HttpResponse('添加失败!')# 返回return HttpResponse('添加成功!')# 第四种方式:
def save_stu4(request):# 处理异常try:# 创建对象,并返回stu = StudentModel.objects.get_or_create(name='芬芳', age=21)print('stu=', stu)except Exception as ex:return HttpResponse('添加失败!')# 返回return HttpResponse('添加成功!')# 第五种方式:批量添加
def save_stu5(request):# 处理异常try:for i in range(5, 15):# 创建对象stu = StudentModel.objects.create(name=f'boy{i}', age=f'{i}')except Exception as ex:return HttpResponse('添加失败!')# 返回return HttpResponse('添加成功!')
说明:使用create方法是最常用的,第五种是批量添加数据
(2)删除数据(1条或多条)
# 删除一条数据
# (1) 先找到删除的数据
# (2) 再删除数据
def del_stu(request):# 处理异常try:# 创建对象stu = StudentModel.objects.first() # 删除第一条数据stu.delete() # 删除except Exception as ex:return HttpResponse('删除失败!')# 返回return HttpResponse('删除成功!')# 删除多条数据
# (1) 先找到删除的数据
# (2) 再删除数据
def del_stu2(request):# 处理异常try:StudentModel.objects.filter(age__gte=20).delete() # 删除多条条件except Exception as ex:return HttpResponse('删除失败!')# 返回return HttpResponse('删除成功!')
(3) 修改数据 (1条或多条)
模型没有定义update方法, 直接给字段赋值, 并调用save, 能实现update的功能, 比如:
obj = StudentModel.objects.get(id=2)
obj.name = 'liu'
obj.save()
save更新时会更新所有字段。如果只想更新某个字段, 减少数据库操作, 可以这么做:
obj.name = 'john'
obj.save(update_fields=['name'])
# 更新一条数据
# (1) 先找到这条数据
# (2) 再修改数据
def update_stu(request):# 处理异常try:# 创建对象stu = StudentModel.objects.first() # 第一条stu.name = 'mike'stu.age = 22# 保存到数据库中stu.save()except Exception as ex:return HttpResponse('更新失败!')# 返回return HttpResponse('更新成功!')# 更新1条数据
# (1) 先找到这条数据
# (2) 再修改数据
def update_stu2(request):# 处理异常try:# 创建对象stu = StudentModel.objects.get(id=18) # 根据id条件stu.name = 'john'stu.age = 20# 保存到数据库中stu.save()except Exception as ex:return HttpResponse('更新失败!')# 返回return HttpResponse('更新成功!')# 更新多条数据
# (1) 先找到这条数据
# (2) 再修改数据
def update_stu3(request):# 处理异常try:# 创建对象StudentModel.objects.all().update(age=25) # 所有数据更新年龄为25except Exception as ex:return HttpResponse('更新失败!')# 返回return HttpResponse('更新成功!')
(4)查询数据
get(): 获取单条数据:
StudentModel.objects.get(id=100)
如果没有找到符合条件的对象, 会引发模型类.DoesNotExist异常
如果找到多个, 会引发模型类.MultipleObjectsReturned异常
first(): 返回查询集(QuerySet)中的第一个对象
last(): 返回查询集中的最后一个对象
count(): 返回当前查询集中的对象个数
exists(); 判断查询集中是否有数据, 如果有数据返回True没有反之False
all(): 获取全部数据: StudentModel.objects.all()
# 查询操作
def get_stu(request):# (1) get():获得一条数据stu = StudentModel.objects.get(id=18)# first; 第一条数据# stu = StudentModel.objects.first()# last; 最后一条数据# stu = StudentModel.objects.last()# 打印print(stu, type(stu))print(stu.name, stu.age)# 返回return HttpResponse('查询成功!')def get_stu2(request):# (2) all():获得所有数据stu = StudentModel.objects.all()# 打印print(stu, type(stu))for st in stu:print(st.name, st.age)# 返回return HttpResponse('查询成功!')
查询 filter()过滤详解
def get_stu3(request):# (3) filter(): 过滤数据,(常使用)# stu=StudentModel.objects.filter() #默认没有条件,就是获取所有的数据# stu=StudentModel.objects.filter(age__lte=26) #有条件,age<=26,就是获取条件数据# stu=StudentModel.objects.filter(age__gte=26) #有条件,age>=26,就是获取条件数据# stu=StudentModel.objects.filter(age__gt=26) #有条件,age>26,就是获取条件数据# stu=StudentModel.objects.filter(age__lt=26) #有条件,age<26,就是获取条件数据# 打印# print(stu, type(stu))# for st in stu:# print(st.name, st.age)# 如果使用的对象是返回结果集的对象可以链接是使用的# print(stu.filter().filter().all().filter())# 注意:在使用链接对象一个对象如果是返回单个对象就表示链接结束# print(stu.filter().filter().get())# 显示调用中# print(stu.get())# print(stu.first())# print(stu.last())# 查询集是否存在数据如果存在数据为True,否则为False# print(stu.exists())# print(stu.all())# 查询数据中的个数# print(stu.count())# values方法和valeus_list()方法stus = StudentModel.objects.filter()# 查询原数据print(stus)# 查询的结果集强制转换成列表print(list(stus))# 列表套字典print(stus.values())# 列表套字典(这个是是字段名)print(stus.values('name', 'age'))# 列表套元组(只有值)print(stus.values_list())# 列表套元组(这个是是字段名)print(stus.values_list('name', 'age'))# 返回return HttpResponse('查询成功!')# filter详讲,类似于sql的where条件
def get_stu4(request):# in# stus = StudentModel.objects.filter(age__in=[16,18,21])# not in 取反# stus = StudentModel.objects.exclude(age__in=[16,18,21])# like 模糊查询# stus = StudentModel.objects.filter(name__contains='y1')# 正则表达式 匹配m开头 ,区分大小写# stus = StudentModel.objects.filter(name__regex='^m')# 不区分大小写# stus = StudentModel.objects.filter(name__iregex='^M')# range 在16-21之间范围# stus = StudentModel.objects.filter(age__range=[16, 21])# 以b开头,不区分大小写# stus = StudentModel.objects.filter(name__startswith='m')stus = StudentModel.objects.filter(name__istartswith='m')# 以n结尾,不区分大小写# stus = StudentModel.objects.filter(name__endswith='n')# stus = StudentModel.objects.filter(name__iendswith='n')print(stus)# 返回return HttpResponse('查询成功!')
聚合函数
导包 from django.db.models import Max,Avg,Min,Sum,Count
使用aggregate()函数返回聚合函数的值
Avg: 平均值
Count: 数量
Max: 最大
Min: 最小
Sum: 求和
#聚合函数: max,min,sum,avg,count
def get_stu5(request):from django.db.models import Max,Avg,Min,Sum,Count# stus = StudentModel.objects.aggregate(Max('age'))# stus = StudentModel.objects.aggregate(Avg('age'))# stus = StudentModel.objects.aggregate(Sum('age'))# stus = StudentModel.objects.aggregate(Min('age'))stus = StudentModel.objects.aggregate(Count('age'))print(stus)# 返回return HttpResponse('查询成功!')
排序(升序,降序)
升序:order_by('字段名') 默认
降序:order_by('-字段名')
#排序: 升序,降序
def get_stu6(request):#ASC 1个字段stus = StudentModel.objects.all().order_by('age')#ASC 两个字段# stus = StudentModel.objects.all().order_by('age','id')#DESC# stus = StudentModel.objects.all().order_by('-age')print(stus)# 返回return HttpResponse('查询成功!')
数据表