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

时间:2022-02-18 20:11:02

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

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

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))