• 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")
  • 相关阅读:
    some things
    关于我的兼职创业历程
    慢牛APP相关截图
    慢牛系列五:用百度语音识别添加自选股
    慢牛系列四:好玩的React Native
    慢牛系列三:React Native实践
    慢牛系列二:前端技术选择
    慢牛系列一:如何抓取股票数据
    会写程序的屌丝是潜力股
    慢牛股票-基于Sencha+Cordova的股票类APP
  • 原文地址:https://www.cnblogs.com/wangyuqi6688/p/11023930.html
Copyright © 2020-2023  润新知