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)
  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/hesujian/p/11197283.html
Copyright © 2011-2022 走看看