2016-02-27 82 views
1

我想通过预先汇总的数据集来完成一个组,然后使用ModelAdmin加入该数据。因此,对于各种实体,我希望显示类似于Google Analytics(分析)的汇总数据。如何使用Django中的管理查询集加入groupby子查询

我对实体

class Link(AnalyticalObject): 
    name = models.CharField(max_length=60) 
    url = models.CharField(max_length=60) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 

的模型和汇总数据

class LinkByDayAnalytic(models.Model): 
    project = models.ForeignKey(Project) 
    link = models.ForeignKey(Link) 
    day = models.DateField(db_index=True) 
    clicks = models.IntegerField() 
    emails = models.IntegerField() 
    purchases = models.IntegerField() 
    revenue = models.FloatField() 

,我试图修改查询集上的ModelAdmin做GROUPBY并加入一个模型数据与项目(在这种情况下的链接)。

def get_queryset(self, request): 
    qs = super(ProjectAdmin, self).get_queryset(request) 
    ''' 
     Do analytics query 
    ''' 
    qs.annotate(newcol=RawSQL("select lander_id, SUM(purchases) as purchases FROM manager_campaignbydayanalytic GROUP BY lander_id",[])) 
    print qs.query 
    #qs. 

    return qs 

我附上了这个截图来说明我想要的结果。我似乎无法将我的头围绕注释,附加和额外。

Desired admin outcome

+0

什么是你的子查询中的'lander_id'和'manager_campaignbydayanalytic'? – GwynBleidD

回答

0

不幸的是,在Django没有办法通过做自定义组。

但幸运的是,对于那个理想的结果,你不需要任何自定义的结果。

首先,在你LinkByDayAnalytic模型上link场定义related_name

link = models.ForeignKey(Link, related_name="by_day_analytics") 

现在准备查询:

qs.annotate(
     purchases_analytic=Sum('by_day_analytics__purchases"), 
     clicks=Sum('by_day_analytics__clicks'), 
     emails=Sum('by_day_analytics__emails'), 
     email_pct=Sum('by_day_analytics__emails')/Sum('by_day_analytics__clicks') * 100, 
     # etc... 
    ) 

而旁边 - 使用在自定义列计算值(他们不会自动出现在列表显示中)。