Django-ORM ModelsApi

本文详细介绍了如何使用ORM(对象关系映射)技术进行数据库操作,包括数据的查询、筛选、更新和删除。通过具体实例,展示了如何利用模型类接口进行高效的数据处理,涵盖了常见数据库操作的各个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对数据表进行增删改查-通过模型类接口ModelsApi来实现的,也就是我们数据库相关的接口,这个接口返回的是个查询集合QuerySet它是一个可迭代对象
 #1.查询、检索、过滤
        teachers=Teacher.objects.all() #objects是模型类的对象管理器如果没有更改的话是默认的 all()就是取出所有的结果
        print(teachers)
        teacher2=Teacher.objects.get(nickname="Jack")#get()只能返回一条结果,多条则会报错因此在函数中通常传递的是主键或者是唯一建作为参数
        print(teacher2,type(teacher2)) #返回的是一个模型类
        teachers3=Teacher.objects.filter(fans__gte=500)#返回的是QuerySet 可以是多条结果
        for t in teachers3:
            print("讲师姓名{}--粉丝数{}".format(t.nickname,t.fans))
        #字段数据匹配,大小写敏感
        teacher4=Teacher.objects.filter(fans__in=[666,1231])
        print(teacher4)
        teacher5=Teacher.objects.filter(nickname__icontains='A')#查询包含A不区分大写的人
        print(teacher5)
        #结果切片、排序、链式查询
        print(Teacher.objects.all()[:1])
        teacher6=Teacher.objects.all().order_by('-fans')
        for t in teacher6:
            print(t.fans)
        print(Teacher.objects.filter(fans__gte=500).order_by("nickname"))#链式查询就是对返回的查询集继续使用API
        #查看执行的原生SQL
        print(Teacher.objects.filter(fans__gte=500).order_by("nickname").query)
        """
        SELECT `orm_teacher`.`nickname`, `orm_teacher`.`introduction`, `orm_teacher`.`fans`, `orm_teacher`.`created_at`, `orm_teacher`.`updated_at` FROM `orm_teacher` WHERE `orm_teacher`.`fans` >= 500 ORDER BY `orm_teacher`.`nickname` ASC
        """

返回新QuerySet的API:去重、排序、使用聚合计数、求和、平均数、反向查询等
 #1.all(),filter(),order_dy(),exclude(),reverse(),distinct()去重
        print(Student.objects.all().exclude(nickname='A同学'))#查询出所有的数据并去掉nickname=A同学的数据
        s1=Student.objects.all().reverse() #使用reverse的话必须在模型类的元数据中添加ordering=['age']
        for s in s1:
            print(s.nickname,s.age)

        #2.extra(),defer(),only()实现字段别名,排除一些字段,选择一些字段
        s2=Student.objects.all().extra(select={'name':'nickname'}) #使用别名
        for s in s2:
            print(s.name)
        print(Student.objects.all().only('nickname','age').query)

        #3.values(),values_list()获取字段或者元祖形式的QuerySet
        print(TeacherAssistant.objects.values('nickname','hobby')) #返回的是一个字典
        print(TeacherAssistant.objects.values_list('nickname','hobby'))#返回的是一个元祖
        print(TeacherAssistant.objects.values_list('nickname',flat=True))#当使用values_list只取一个字段的话可以使用一个参数flat=True这个用于将单个字段直接放到列表里面
        #4.dates(),datetimes()根据时间日期获取查询集
        print(Course.objects.dates('created_at','month',order='DESC'))#查询字段,按照什么排序,排序方式

        #5.union(),intersection(),difference()并集、交集、差集
        p_240=Course.objects.filter(price__gte=240) #查询课程信息表中价格大于等于240的信息
        p_260=Course.objects.filter(price__lte=260) #查询课程信息表中价格小于等于240的信息
        print(p_240.union(p_260))
        #print(p_240.intersection(p_260))
        #print(p_240.defference(p_260))

        #6.select_related()一对一、多对一查询优化,prefetch_related()一对多、多对多查询优化;反向查询
        """通过课程查询讲师"""
        courses=Course.objects.all().select_related('teacher')#指定外键字段这样可以减少查询次数增加效率
        for c in courses:
            print(f"{c.title}--{c.teacher.nickname}--{c.teacher.fans}")
        """通过学生查询课程"""
        students=Student.objects.filter(age__lt=30).prefetch_related('course')
        for s in students:
            print(s.course.all())
        """通过讲师查询课程"""
        #使用反向查询需要在外键中添加一个参数related_name="xxxx"然后下面course_set替换成xxxx和下面效果一样
        print(Teacher.objects.get(nickname="Jack").course_set.all())

        #7.annotate()使用聚合计数、求和、平均数 raw()执行原生SQL
         #from django.db.models import Count,Avg,Max,Min,Sum
        """讲师课程销量总和"""
        print(Course.objects.values('teacher').annotate(vol=Sum('volume')))
        print(Course.objects.values('teacher').annotate(vol=Avg('price')))

不返回QuerySet的API:获取、创建、更新、删除对象、统计记录、聚合等

  """不返回Query API"""
        #1.获取对象get(),get_or_create(),first(),last(),latest(),earliest(),in_bulk()
        print(Course.objects.first())#获取第一条记录
        print(Course.objects.last())#获取最后一条记录
        """latest()earliest()表示最早或最近的记录使用这两个之前在元数据中添加get_latest_by='created_at'让它根据创建时间来排序"""
        print(Course.objects.latest())
        print(Course.objects.earliest())
        """in_bulk()批量返回对象,这个需要根据主键的值来传递个列表"""
        print(Course.objects.in_bulk(['Java系列教程4','Golang系列教程1']))

        #2.创建对象create(),bulk_create(),update_or_create() 创建,批量创建,创建或更新
                 #批量导入数据的时候有使用过

        #3.更新对象update(),update_or_create() 更新,更新或创建
        Course.objects.filter(title="Java系列教程1").update(price=300) #把这个课程的价格更新成300

        #4.删除对象delete() 使用filter过滤
        #这里尽量使用filter不要使用get如果使用get没有返回对象或返回空的对象的话会报错
        Course.objects.filter(title='test').delete()

        #5.其他操作 exists(),count(),aggregate()判断是否存在,统计个数,聚合
        print(Course.objects.filter(title='test').exists())#返回false
        print(Course.objects.filter(title='Java系列教程1').exists())#返回True
        print(Course.objects.count())#返回数据表里面的记录数
        """aggreagte和annotate的区别"""
        #annotate一般适合.value结合使用对分组后的结果进行统计而aggreagte是对整个数据表里的数据进行统计
        #举个例子我们需要统计课程信息表中所有课程的平均价,最高价,最低价,以及销量的总和
        print(Course.objects.aggregate(Max('price'),Min('price'),Avg('price'),Sum('volume')))
在setting中添加logging查看每个模型执行的sql语句
import logging
LOGGING={
    'version':1, #日志级别
    #日志处理器
    'handlers':{
        'console':{
            'class':'logging.StreamHandler',
        },
    },
    #日志管理器
    'loggers':{
        'django.db.backends':{
            'handlers':['console'],
            'level':'DEBUG' if DEBUG else 'INFO'
        },
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值