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")

 

posted on 2019-06-14 16:20  王玉琪6688  阅读(164)  评论(0编辑  收藏  举报

导航