Django ORM 操作 必知必会13条 单表查询
ORM 操作 必知必会13条
import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTINGS_MODULE','orm_p.settings') import django django.setup() # 初始设置 脚本 加载了Django环境 from app01 import models ret = models.Person.objects.all() # QuerySet all 所有 ret = models.Person.objects.get(pk=101) # 获取不到或者多个就报错 获取某一条数据 对象 ret = models.Person.objects.filter(name = 'alex') # QuerySet 对象列表 满足条件 ret = models.Person.objects.exclude(name = 'alex')# 满足条件后取反--反选 对象列表 ret = models.Person.objects.values() # QuerySet 获取数据所有字段的值 不再是对象,变成字典 ret = models.Person.objects.filter(name = 'alex').values() # QuerySet 获取条件数据所有字段的值 不再是对象,变成字典 ret = models.Person.objects.filter(name = 'alex').values('pid','name') # QuerySet 获取条件数据所有字段的值 不再是对象,变成字典 # 不指定字段显示所有,指定字段显示选择内容 { 值 值} ret = models.Person.objects.filter(name = 'alex').values_list() # QuerySet 获取条件数据所有字段的值 不再是对象,变成字典 # 获取字段的值 元组 ( 值 值 ) --> 传字段 ret = models.Person.objects.all().order_by('-pid','age') # 升序 -pid 降序 左优先 多个字段排序 ret =ret.reverse() # 排好序的 后面反转的 ret = models.Person.objects.all() # 这个用reverse 没效果 models.py 中 class Meta: ordering = ('pid') ret = models.Person.objects.all().distinct() # distinct() 去重 mysql不支持按字段去重 ret = models.Person.objects.values('name').distinct() # distinct() 去重 ret = models.Person.objects.count() # 计数 ret = models.Person.objects.filter(pid=122).first() # 第一个 查不到/不报错/返回None ret = models.Person.objects.all().last() # 取最后一个 ret = models.Person.objects.filter(pid=100).exists() # 查存在不 返回True/Flase
总结: 返回queryset的有 all() , filter() , exclude() , order_by() , reverse() , distinct() 特殊的queryset的有 values() values_list() 返回数字的: count() 返回具体对象的 get() first() last() 返回布尔值的 exists()
单表的双下划线方法
import os os.environ.setdefault('DJANGO_SETTINGS_MODULE','orm_p.settings') import django django.setup() # 初始化 # 单表查询 from app01 import models ret = models.Person.objects.filter(pk__gt=100) # greater than 大于 ret = models.Person.objects.filter(pk__lt=100) # less than 小于 ret = models.Person.objects.filter(pk__gte=100) # greater than equal 大于等于
ret = models.Person.objects.filter(pk__lte=100) #小于等于
ret = models.Person.objects.filter(pk__in=[100,103]) #查几个
ret = models.Person.objects.exclude(pk__in=[100,103]) #原生sql 中的 not in
ret = models.Person.objects.filter(pk__lte=103,pk__gte=100) # 大于等于 -- 小于等于
ret = models.Person.objects.filter(pk__range=[100,103]) # 什么范围
ret = models.Person.objects.filter(name__contains = 'l') # 原生sql中的 like 包含
ret = models.Person.objects.filter(name__icontains = 'L') # 大小写 不敏感
ret = models.Person.objects.filter(name__startswith = 'x') # 开头
ret = models.Person.objects.filter(name__istartswith = 'X') # 不敏感处理
ret = models.Person.objects.filter(name__endswith = 'X') # 以什么结束
ret = models.Person.objects.filter(name__iendswith = 'X') # 不敏感处理
ret = models.Person.objects.filter(birth__year='2019') #条件查询
ret = models.Person.objects.filter(birth__month='01') # 查不到
ret = models.Person.objects.filter(birth__contains='2019-01-24') # 能查了
ret = models.Person.objects.filter(age__isnull=True) # 是否为空
外键查询
正向查找 对象查找(跨表) 语法:对象.关联字段.字段 book_obj = models.Book.objects.first() # 第一本书对象 print(book_obj.publisher) # 得到这本书关联的出版社对象 print(book_obj.publisher.name) # 得到出版社对象的名称 字段查找(跨表) 语法: 关联字段__字段 print(models.Book.objects.values_list("publisher__name")) ------------------------------------------------------------------ 反向查找 对象查找 语法:obj.表名_set publisher_obj = models.Publisher.objects.first() # 找到第一个出版社对象 books = publisher_obj.book_set.all() # 找到第一个出版社出版的所有书 titles = books.values_list("title") # 找到第一个出版社出版的所有书的书名 字段查找 语法:表名__字段 titles = models.Publisher.objects.values_list("book__title")
ManyToManyField