Django--ORM高级查询

 高级查询
# 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)

原文地址:https://www.cnblogs.com/duGD/p/11203981.html