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('查询成功!')

数据表

相关推荐
技术宝哥1 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸2 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1233 小时前
Redis解析
数据库·redis·缓存
数据库幼崽3 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd3 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
noravinsc3 小时前
redis是内存级缓存吗
后端·python·django
betazhou3 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
百锦再4 小时前
大数据技术的主要方向及其应用详解
大数据·linux·网络·python·django·pygame
lyrhhhhhhhh4 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
noravinsc5 小时前
django中用 InforSuite RDS 替代memcache
后端·python·django