Django 模型操作(六)

Django通过Model操作数据库, 不管你数据库的类型是MySql或者Sqlite, Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要会写Model就可以 了。

django使用对象关系映射 (Object Relational Mapping, 简称ORM)框架去操控数据库。

ORM(Object Relational Mapping)对象关系映射, 是一种程序技术, 用于实现面向对象编程语言里不同类型系统的数据之间的转换。

一、模型

python 复制代码
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种方式

python 复制代码
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条或多条)

python 复制代码
# 删除一条数据
# (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'])

python 复制代码
# 更新一条数据
# (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)  # 所有数据更新年龄为25
    except 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()

python 复制代码
# 查询操作
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()过滤详解

python 复制代码
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: 求和

python 复制代码
#聚合函数: 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('-字段名')

python 复制代码
#排序: 升序,降序
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('查询成功!')

数据表

相关推荐
全栈师13 分钟前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle
Data 31721 分钟前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop
BergerLee1 小时前
对不经常变动的数据集合添加Redis缓存
数据库·redis·缓存
gorgor在码农1 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql
bug菌¹2 小时前
滚雪球学Oracle[6.2讲]:Data Guard与灾难恢复
数据库·oracle·data·灾难恢复·guard
一般路过糸.2 小时前
MySQL数据库——索引
数据库·mysql
Cengineering2 小时前
sqlalchemy 加速数据库操作
数据库
wxin_VXbishe2 小时前
springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290
java·spring boot·python·spring·servlet·django·php
Cikiss2 小时前
微服务实战——平台属性
java·数据库·后端·微服务
小小不董3 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba