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方法大全

原文地址:https://www.cnblogs.com/wuchenggong/p/9414529.html