zoukankan      html  css  js  c++  java
  • Django框架——模型(models)层之ORM查询(一)

    一、ORM查询

    1.1配置环境

    如果你向查看orm语句内部真正的sql语句有两种方式
    1.如果是queryset对象 可以直接点query查看
    2.配置文件settings中 直接配置

    LOGGING = {
                    'version': 1,
                    'disable_existing_loggers': False,
                    'handlers': {
                        'console': {
                            'level': 'DEBUG',
                            'class': 'logging.StreamHandler',
                        },
                    },
                    'loggers': {
                        'django.db.backends': {
                            'handlers': ['console'],
                            'propagate': True,
                            'level': 'DEBUG',
                        },
                    }}
    django测试环境搭建
        import os
        if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings")
        import django
        django.setup()
        # 你就可以在下面测试django任何的py文件

    1.2单表查询

    必知必会13条

    all() 查询所有
    filter() 获取一个列表,里面是QuerySet对象
    get() 获取数据对象本身
    first() 拿第一个
    last() 那最后一个
    exclude() 除此之外
    values() 获取一个列表套字典,QuerySet对象
    values_list() 获取一个列表套元组,QuerySet对象
    count() 统计数据个数
    distinct() 去重(数据必须是一模一样)
    order_by() 排序(默认是升序)
    reverse() 反转(一定要先排序才能反转)
    exists() 判断有没有数据

    神奇的下划线查询

    '''eg:res = models.Book.objects.filter(price__gt=200)'''
    __gt 大于,__gte 大于等于
    __lt 小于,__lte 小于等于
    price__in=[12,25] 价格是12或者是25 ,__in 或者
    price__rang=(12,25) 价格在12~25之间,顾头不顾尾。
    #模糊匹配
    __contains=x 包含x的
    __icontains 忽略大小写

    __startswith 以什么为开头
    __endswith 以什么结束

    __year 年,__month 月

    1.3多对多字段的四个方法

    #
    1.add() 括号内既可以传数字,也可以传数据对象,而且都支持一次性传多个
    #
    2.set() 括号内既可以传数字,也可以传数据对象,而且都支持一次性传多个,但是括号内必须是可迭代对象
    #
    3.remove() 号内既可以传数字,也可以传数据对象,而且都支持一次性传多个,
    #清空
    clear() 括号内不需要传任何参数 直接清空当前对象所有的记录

    4.跨表查询的规律

    ORM跨表查询分为子查询和连表查询

    查询又分为正反向查询:
    外键字段在哪个表,从那个表出发查询就是正向查询,反之为反向查询
    即外键在哪个表,谁就是正向查询,没有外键就是反向查询
    ***正向查询按字段***
    ***反向查询按表名小写***

    # 1.基于对象的跨表查询>>>>子查询
    # eg:查询书籍是python入门的出版社名称
    book_obj = models.Book.objects.filter(title='python入门').first()
    #  正向查询按字段
    print(book_obj.publish.name)
    
    """
        正向查询 按字段 
        当该字段所对应的数据有多个的时候 需要加.all()
        否则点外键字段直接就能够拿到数据对象
    """
    #eg:查询出版社是东方出版社出版过的书籍
    publish_obj = models.Publish.objects.filter(name='东方出版社').first()
    print(publish_obj.book_set)  #出现 app01.Book.None,表示代码没问题,需要加.all()
    print(publish_obj.book_set.all())
    
    """
        反向查询按表名小写 
            什么时候需要加_set
                当查询的结果可以是多个的情况下 需要加_set.all()
            什么时候不需要加_set
                当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
     """
    #eg:查询书籍是python入门的作者的手机号
    book_obj = models.Book.objects.filter(title='python入门').first()
    print(book_obj.authors.all())
     # 2.基于双下划綫的跨表查询>>>>连表查询
     '''
     跨两张表查询:
     正向查询:按关联字段+双下划线+要取的那张被关联表中的字段
     反向查询:按表名小写+双下划线+要取的那张被关联表中的字段
     '''
    
    '''
    跨多表,连续跨
    连续跨的操作的套路与两张表的一样,可以连续接n个双下划线,只需要在每次连双下划线时,确定是正向还是反向的
    '''
    ```

    """
    left join
    right join
    inner join
    union
    """
    # 正向
    models.Book.objects.filter(title='python').values('publish__name')
    # 写外键字段publish之后 就会跨到publish表中 你想要该表的哪个字段对应的数据 就加__字段名获取

    models.Book.objecst.filter(pk=1).values('authors__name')

    models.Author.objects.filter(name='jason').values('author_detail__addr')

    models.Publish.objects.filter(pk=1).values('book__title')
    models.authors.objects.filter(pk=1).values('book__title')
    models.AuthorDetail.objects.filter(pk=1).values('author__name')


    # 反向

    models.Publish.objects.filter(book__title='python').values('name')

    
    


    """查询书籍id为1 的作者的 手机号"""
    models.Book.objects.filter(pk=1).values('authors__author_detail__phone')

     
  • 相关阅读:
    IntelliJ IDEA常用统一设置2-Inspections检查设置(Linux/Mac/Windows)
    IntelliJ IDEA版本:Ultimate、Community、EAP版本的区别
    IntelliJ IDEA重构技巧收集
    Java泛型中的类型擦除机制简单理解
    阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
    Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)
    Java使用logback记录日志时分级别保存文件
    Java中List,Set和Map详解及其区别和使用场景(转)
    Java中泛型的Class<Object>与Class<?>的区别(转)
    Java中泛型T和Class<T>以及Class<?>的理解(转)
  • 原文地址:https://www.cnblogs.com/lulingjie/p/11773131.html
Copyright © 2011-2022 走看看