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))
原文地址:https://www.cnblogs.com/wen-kang/p/9588639.html