• python全栈开发day68-ORM操作:一般操作、ForeignKey操作、ManyToManyField、聚合查询和分组查询、F查询和Q查询等


    ORM操作

    https://www.cnblogs.com/maple-shaw/articles/9403501.html

    一、一般操作

      1. 必知必会13条 

     1 <1> all():                 查询所有结果
     2 
     3 <2> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
     4  
     5 <3> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
     6  
     7 <4> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
     8  
     9 <5> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
    10  
    11 <6> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    12  
    13 <7> order_by(*field):      对查询结果排序
    14  
    15 <8> reverse():             对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
    16  
    17 <9> distinct():            从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
    18  
    19 <10> count():              返回数据库中匹配查询(QuerySet)的对象数量。
    20  
    21 <11> first():              返回第一条记录
    22  
    23 <12> last():               返回最后一条记录
    24  
    25 <13> exists():             如果QuerySet包含数据,就返回True,否则返回False
    必知必会13条

      2. 单表查询之神奇的双下划线

        1) id__gt  id__gte  id__lt  id__lte  id__in  id_range=[1,5]

        2) name__contains  name__icontains  name__startswith  name__istartswith  name__endswith  name__iendswith

        3) date字段  birthday__year  birthday__month  birthday__day

        4) __exact   __iexact #精确等于like'aaa'

        5) __regex  __iregex

    二、ForeignKey操作

       1.正向查找

          1) 对象查找跨表

             book_obj.publisher

             book_obj.publisher.name

           2) 字段查

             models.Book.objects.values_list("publisher__name")    

       2.反向操作

          对象查找: obj.表名_set (设置了related_name 按此查询) 拿到管理的对象

          字段查找:表名__字段

    三、ManyToManyField操作

          通过表与表之间的管理对象进行相关的骚操作,针对一对多、多对多的操作:

          create()  

          add()

          set()

          remove()

          clear()

          ForeignKey字段没设置null=True时,没有clear()和remove()方法

          ForeignKey字段设置null=True时,有clear()和remove()方法

          对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调save()方法

    四、聚合查询和分组查询

      1.聚合查询

        models.Book.objects.aggregate(average_price=Avg('price'))

       2.分组查询(基本思路先查出分组对象,然后调用annotate进行分组计算)

        1)

        from django.db.models import Avg
        Employee.objects.values("dept").annotate(avg=Avg("salary").values("dept", "avg")
        
        2)
        
        from django.db.models import Avg
        models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name", "avg")

    五、F查询和Q查询

           1 F查询

            F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

           2 Q查询

            你需要执行更复杂的查询(例如OR语句)

            Q(id=1) |Q(id>3)  &   ~

            注意点:查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,关键字参数必须位于所有关键字参数的前面。

           3 字符串拼接

        

    六、事务  transaction  

     from django.db import transaction   

      with transaction.atomic():

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        import datetime
        from app01 import models
    
        try:
            from django.db import transaction
            with transaction.atomic():
                new_publisher = models.Publisher.objects.create(name="火星出版社")
                models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10)  # 指定一个不存在的出版社id
        except Exception as e:
            print(str(e))
    例子知晓

    七、Django终端打印SQL语句

      

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    View Code

    八、在Python脚本中调用Django环境

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        from app01 import models
    
        books = models.Book.objects.all()
        print(books)
    View Code

    九、其他

      Django ORM执行原生SQL

      QuerySet方法大全

  • 相关阅读:
    osip2 代码分析
    批处理命令——call 和 start
    在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
    Gerrit 代码审核服务器的工作流和原理
    crucible VS gerrit
    领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型都是常用的客户-服务器编程模型
    半同步半异步I/O的设计模式(half sync/half async)
    高并发系统设计
    通过Nginx反向代理之后客户端验证码session不一致造成无法验证通过的问题解决
    使用Nodpad++正则替换
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/9414529.html
Copyright © 2020-2023  润新知