• ORM的分组与聚合函数查询数据


    通过作者去查询书的操作:作为反向查询

    可以先查询作者的记录,然后通过多对多的第三张表操作去反向查询,在表间约束属性下进行调用

    1 class Author(models.Model):
    2     aid=models.AutoField(primary_key=True)
    3     aname=models.CharField(max_length=64,null=False,unique=True)
    4     book=models.ManyToManyField(to='Book')

    表间约束构成book_author表

    可以通过create和add方法来添加数据

    1 book_obj=models.Book.objects.filter(bid__gt=4)
    2     models.Author.objects.filter(aid=5)[0].book.add(*book_obj)
    3     print(book_obj)

    需要注意的是:用到filter时,必须牢记其返回的结果为一个对象列表集。因此想对里面的对象进一步操作时,

    必须先取对象出来,再进行数据处理

    聚合函数:

    1     from  django.db.models import Max,Min,Count,Avg,Sum
    2 
    3     # obj=models.Book.objects.all().annotate(aid=Count('author'))

    分组:

    1     auto_obj=models.Author.objects.all().annotate(price_sum=Sum('book__price')).values_list('aname','price_sum')
    2     print(auto_obj)
    3     obj=models.Author.objects.all().annotate(book_cot=Count('book'),price_sum=Sum('book__price'))
    4     for a in obj:
    5         print(a.book_cot,a.aname,a.price_sum)

    希望Django终端输出SQL语句:

    可以在setting配置文件最后里面加入logging代码块:

     1 LOGGING = {
     2     'version': 1,
     3     'disable_existing_loggers': False,
     4     'handlers': {
     5         'console':{
     6             'level':'DEBUG',
     7             'class':'logging.StreamHandler',
     8         },
     9     },
    10     'loggers': {
    11         'django.db.backends': {
    12             'handlers': ['console'],
    13             'propagate': True,
    14             'level':'DEBUG',
    15         },
    16     }
    17 }

    F查询比较字段列与Q查询(相当于条件or 字段属性必须放在Q后面)

     1  from django.db.models import F,Q
     2         # show= models.Book.objects.all().filter(kucun__gt=F('sale'))
     3         # print(show)
     4 
     5         # models.Book.objects.update(kucun=(F('kucun')+1)*3)
     6         # from django.db.models.functions import Concat
     7         # from django.db.models import Value
     8         # models.Book.objects.update(bname=Concat(F('bname'),Value('第四版')))
     9         p=models.Book.objects.filter(Q(author__aname='蒋梦玲')|Q(author__aname='李菲菲'))
    10         print(p)

     事务:保证数据的原子性操作,try里面的语句块必须全部正确执行才通过,否则执行exception

    1   try:
    2         from django.db import transaction
    3         with transaction.atomic():
    4             new_press=models.Press.objects.create(name='火星出版社')
    5             models.Book.objects.create(bname='橘子物语',press_id=9,price=9.8)
    6     except Exception as e:
    7         print(str(e))
  • 相关阅读:
    win10 创建安卓模拟器及启动的方法
    win10 virtualenv
    win10安装nodejs
    python模块打包方法
    win10 安装java
    git push后自动部署
    ubuntu配置无密码登录
    mysql while,loop,repeat循环,符合条件跳出循环
    centos 安装mysql密码修改后还是不能连接的原因
    查看SQLServer数据库信息的SQL语句
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9588639.html
Copyright © 2020-2023  润新知