django中的orm常用api总结

摘自某课网免费课程

全面掌握Django ORM

		# 1.查询、检索、过滤
        teachers = Teacher.objects.all()
        print(teachers)
        teacher2 = Teacher.objects.get(nickname='Jack')  # get()只能返回一条结果,多条则会报错
        print(teacher2, type(teacher2))
        teacher3 = Teacher.objects.filter(fans__gte=500)  # QuerySet, 可以是多条结果
        for t in teacher3:
            print(f"讲师姓名{t.nickname}--粉丝数{t.fans}")
        # 2.字段数据匹配,大小写敏感
        teacher4 = Teacher.objects.filter(fans__in=[666, 1231])
        print(teacher4)
        teacher5 = Teacher.objects.filter(nickname__icontains='A')
        print(teacher5)
        # 3.结果切片、排序、链式查询
        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'))
        # 4.查看执行的原生SQL
        print(str(Teacher.objects.filter(fans__gte=500).order_by('nickname').query))
        """SELECT `courses_teacher`.`nickname`, `courses_teacher`.`introduction`, `courses_teacher`.`fans`,
        `courses_teacher`.`created_at`, `courses_teacher`.`updated_at` FROM `courses_teacher`
        WHERE `courses_teacher`.`fans` >= 500 ORDER BY `courses_teacher`.`nickname` ASC
        """
        # """返回新QuerySet API"""
        # 1.all(), filter(), order_by(), exclude(), reverse(), distinct()
        s1 = Student.objects.all().exclude(nickname='A同学')
        for s in s1:
            print(s.nickname, s.age)
        s2 = Student.objects.all().exclude(nickname='A同学').reverse()
        for s in s2:
            print(s.nickname, s.age)
        # 2.extra(), defer(), only() 实现字段别名;排除一些字段;选择一些字段
        s3 = Student.objects.all().extra(select={"name": "nickname"})
        print(s3)
        for s in s3:
            print(s.name)
        print(str(Student.objects.all().only('nickname', 'age').query))
        # 3.values(), values_list() 获取字典或元组形式的QuerySet
        print(TeacherAssistant.objects.values('nickname', 'hobby'))
        print(TeacherAssistant.objects.all())
        print(TeacherAssistant.objects.filter('nickname', 'hobby'))
        print(TeacherAssistant.objects.values_list('nickname', 'hobby'))
        print(TeacherAssistant.objects.values_list('nickname', flat=True))
        # 4.dates(), datetimes()  根据时间日期获取查询集
        print(Course.objects.dates('created_at', 'year', order='DESC'))
        print(Course.objects.datetimes('created_at', 'year', order='DESC'))
        # 5.union(), intersection(), difference() 并集、交集、差集
        p_240 = Course.objects.filter(price__gte=240)
        p_260 = Course.objects.filter(price__lte=260)
        print(p_240.union(p_260))
        print(p_240.intersection(p_260))
        print(p_240.difference(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())
        # 反向查询
        print(Teacher.objects.get(nickname="Jack").course_set.all())
        # 7.annotate() 使用聚合计数、求和、平均数 raw() 执行原生的SQL
        print(Course.objects.values('teacher').annotate(vol=Sum('volume')))
        print(Course.objects.values('teacher').annotate(pri=Avg('price')))
        """不返回Query API"""
        # 1.获取对象 get(), get_or_create(), first(), last(), latest(), earliest(), in_bulk()
        print(Course.objects.first())
        print(Course.objects.last())
        print(Course.objects.earliest())
        print(Course.objects.latest())
        print(Course.objects.in_bulk(['Python系列教程4', 'Golang系列教程1']))

        # 2.创建对象 create(), bulk_create(), update_or_create() 创建,批量创建,创建或更新

        # 3.更新对象 update(), update_or_create() 更新,更新或创建
        Course.objects.filter(title='Java系列教程2').update(price=300)

        # 4.删除对象 delete() 使用filter过滤
        Course.objects.filter(title='test').delete()

        # 5.其它操作 exists(), count(), aggregate() 判断是否存在,统计个数,聚合
        print(Course.objects.filter(title='test').exists())
        print(Course.objects.filter(title='Java系列教程2').exists())
        print(Course.objects.count())
        print(Course.objects.aggregate(Max('price'), Min('price'), Avg('price'), Sum('volume')))
        courses = Course.objects.values('teacher').annotate(t=GroupConcat('title', distinct=True,
                                                                          ordering='title ASC',
                                                                          separator='-'))
        for c in courses:
            print(c)
        Course.objects.update(price=F('price') - 11)
        print(Course.objects.filter(volume__lte=F('price') * 10))
        print(Course.objects.filter(Q(title__icontains='java') & Q(volume__gte=5000)))
        print(Course.objects.filter())
        print(Course.objects.filter(Q(title__icontains='golang') | Q(volume__lte=1000)))
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值