Django模型融合

        今天学习了一下Django模型的聚合,特此总结。

        聚合,意思就是对某一特定对象或者某些对象进行特定数据的融合,统计。说白了就是把一堆value统计起来。

        聚合(Aggregation)主要分为两种:

  1. 对一整个查询集进行融合,英文aggregates over a QuerySet;
  2. 对查询集的每一个对象进行融合。aggregates for each item in a QuerySet
     

        第一种,我们得到了一个QuerySet,然后统计一些字段的相关信息。主要方法是aggrevate。


class Book(models.Model):
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)

>>> from django.db.models import Max
>>> Book.objects.all().aggregate(Max('price'))
{'price__max': Decimal('81.20')}
>>>  Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}

      看到上面返回的结果,就知道aggrevate返回的是一个字典,这对于QuerySet来说就是一个终止句,意思是后面不能再用任何QuerySet的方法了,因为它已经不是QuerySet的了,只是一个普通的Python字典。

    除了Avg,还有Min,Max等等方法。

    第二种, 我们想对查询集的每一个对象都做聚合,那就要用另外一张方法annotate。什么场景会用到它呢?比如,我现在有一周的工作信息数据,我想要每天的工作信息有多少个。这时就可以用到它了。

    先拿一个官网的例子来说:

# Build an annotated queryset
>>> from django.db.models import Count



from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

class Book(models.Model):
    authors = models.ManyToManyField(Author)
   


q = Book.objects.annotate(Count('authors'))


  这个例子是统计每一本书出现的作者有多少。

  annotate中还有一种是可以根据某一字段进行分组,进行融合。比如我上面说一周工作信息的例子,要按日期分组:

class Job(models.Model):
   load_day = models.DateField()
   ...................



>>> q = Job.objects.values('load_day').annotate(Count('load_day')).order_by()

通过使用values,会根据load_day字段进行分组,即会对同一天的数据进行统计,统计每天的工作信息总数。这里values和annotate的顺序必须得注意,values在前和在后的意义完全不一样。必须在前。

 此外,在上个例子中,我们也看到了,annotate后还跟了一个QuerySet的方法,这也就意味着annotate和aggrevate不同,它不是一个终止句,仍然返回一个QuerySet。

 

更多的用法可参考官网:Aggregation

 

 

 

 

 

 

--------EOF---------
微信分享/微信扫码阅读