zoukankan      html  css  js  c++  java
  • django ORM 基本和高级查询

    基本查询

    # 基本的查询
        res = models.Student.objects.all().first()
        print(res)
        # 返回的是QuerySet  列表中套对象
        res = models.Student.objects.values("name").first()
        print(res)
        # 返回的是QuerySet  列表中套字典
        res = models.Student.objects.values_list("name")
        print(res)
        # 返回的是QuerySet  列表中套元组
    
        # 当然,这写查询后面都可以跟上.first()取列表中的第一个

    高级查询

    # 高级查询
    # 1. in     通过 字段名__in = [1,2]  查询
        res = models.Student.objects.filter(age__in=[12,14,42]).all()
    
    # 2. not in  通过exclude(字段名__in = [1,2])  exclude就是除了的意思
        res = models.Student.objects.exclude(age__in=[12,14,42]).all()
    
    # 3. like 通配查询
        # where name like "李%"  # 代表查询名字以李开头的所有
        # name__istartswith  表示不区分大小写,以什么什么为开头
        res = models.Student.objects.filter(name__startswith="").all()
    
        # where name like "%白"  # 表示匹配以白结尾的所有单词
        # name__iendswith   表示不区分大小写,以什么什么为结尾
        res = models.Student.objects.filter(name__endswith="").all()
    
        # where name like "%小%" 表示匹配中间有 小 字的所有单词
        # name__icontains   表示不区分大小写,包含什么什么的单词
        res = models.Student.objects.filter(name__contains="").all()
    
    # 4. between .. and...  通过  列名__range = [开始位置,结束位置]   闭区间
        res = models.Student.objects.filter(id__range=[2,5]).all()
    
    # 5. limit  通过索引进行切片[10:20]  代表从10取到20  前闭后开
        res = models.Student.objects.all()[5:7]
    
    # 6. order by     通过order by 方法, 前面加"-"就是降序,默认升序
        res = models.Student.objects.order_by("id").all()
    
        # 可以多次排序  先按age字段降序,如果age相同,就按id字段升序
        res = models.Student.objects.order_by("-age","id").all()
    
    # 7. group by
        # 分组需要用到django中的方法
        from django.db.models import Count, Max, Min, Sum
        res = models.Student.objects.values("name").annotate(xxx=Count("id"))
        # 表示的是搜索name字段和对表的id字段计算count,并起了别名为xxx   通过name字段进行分组
       # SELECT "app01_student"."name", COUNT("app01_student"."id") AS "xxx" FROM "app01_student" GROUP BY "app01_student"."name"
    
    # 8. only 只取某列的值
        res = models.Student.objects.only("name","age").all()
        # 取出来是QuerySet 列表里面包含对象,对象中包含name字段的值以及id列的值
        # 和values取值的区别就是only取出来的是列表套对象,values取的是列表套字典
        # 并且,不管你only中是否包含id字段,他都会把你的id字段一并取出来
    
    # 9. defer 取出除了某列以外其他列的值
        res = models.Student.objects.defer("id","name").all()
        # 取出来的也是列表套对象,并且,不管你里面有没有id字段,都会把你id列的值取出来
    
    # 10. using
        # 我们在配置数据库时,会把数据库添加到DATABASES 中
        # DATABASES = {
        #     'default': {
        #         'ENGINE': 'django.db.backends.sqlite3',
        #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        #     }
        # }
        # 如果里面连有多个数据库,就可以通过using来确定使用哪一个数据库
        res = models.Student.objects.all().using("default")
    
    # 11. 查询表中一共有多少条数据
        res = models.Student.objects.count()
    
    # 12. 第一条数据
        res = models.Student.objects.first()
    
    # 13. 最后一条数据
        res = models.Student.objects.last()
    
    # 14. gt 大于  lt 小于  gte 大于等于  lte 小于等于
        res = models.Student.objects.filter(id__gt=8).all()
    
        res = models.Student.objects.filter(id__lte=8).all()
    
    # 15. and 操作    ,  在filter中用逗号隔开就是and
        res = models.Student.objects.filter(id=2,age=23)
        # 返回的还是QuerySet 类型
    
    # 16. or 操作
        # or 需要从django中导入Q方法
        from django.db.models import Q
        res = models.Student.objects.filter(Q(id=2) | Q(age=12))
    
        res = models.Student.objects.filter(Q(Q(id=2) | Q(age=12)) & Q(name="李铁柱"))
        #   | 表示 或   & 表示 与
    
    # 17. 在原有的基础上更新,比如我想让某一列的值整体 + 1
        # 需要从django中导入F方法
        from  django.db.models import F
        models.Student.objects.update(F("age") + 1)
        # 这样age字段就会全部 + 1
    
    # 18. 原生sql语句
        # django也给我们提供了写原生sql的方法
        from django.db import connection    # 导入连接
        cursor = connection.cursor()    # 生成cursor对象
        cursor.execute()     # 可以提交sql语句,也可以传参数
        cursor.fetchall()   # 拿取所有的结果
        cursor.fetchone()   # 拿取一条结果
        
        models.Student.objects.raw()    # 这个方法也可以提交sql语句,不建议使用

     增和删的一些补充

    #
    
    # 一次增加一条数据
    models.Student.objects.create(name="xxx",age=12)
    
    # 一次增加多条数据
    
    obj = [
        models.Student(name="qqq",age=12),
        models.Student(name="aaa",age=32),
        models.Student(name="www",age=21)
    ]
    models.Student.objects.bulk_create(obj)
    
    # 删除
    
    models.Student.objects.filter(name="xxx").delete()
    # 如果是单表删除没有问题,但如果这张表的主键和别的表建立了外键关系,删除这条数据,另一张表对应的数据也会被删除掉
    # 这也称为级联删除,如果我们不需要这样,可以在建外键是给on_delete赋值
    # on_delete 几个参数的含义
        # CASCADE  默认值   级联删除
        # SET_NULL 取消级联删除,如果被关联外键的一条数据删除,关联的对应值用NULL代替,所以需要支持NULL
        # SET_DEFAULT  取消级联删除,被删除就用默认值代替
    
    class Student(models.Model):
        name = models.CharField(max_length=32)
        teac = models.ForeignKey('Teacher', null=True, on_delete=models.SET_NULL)

     多对多的增删改查询

    django----多对多数据添加

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class UserInfo(models.Model):
        """
        用户表:既有班主任也有老师
        """
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        email = models.CharField(max_length=32)
        ut = models.ForeignKey("UserType",on_delete=models.CASCADE)  #用户和用户类型一对多的关系
        teacher_classes = models.ManyToManyField("Classes")  #老师和班级的多对多关系

       obj = UserInfo.objects.filter(id=1).teacher_classes.add(1)  add((1,2,3))  

          通过第三张表建立关系  1 1

                                                                1 2

                                                                1 3

    m.add()                    直接添加数据

    m.set()                     现将数据库清空(和m有关),在add()数据 ,类似重置

    m.remove()              解除关联

    m.clear()                  和m有关的数据全部清空

  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/huikejie/p/11213206.html
Copyright © 2011-2022 走看看