2013-04-28 107 views
0

我使用Python 3.2.3,Django 1.5和PostgreSQL。Django .extra()不工作,因为我期望

我不能理解关于使用.extra()的一些东西,但我完全不知道我错过了什么。从我读过的内容来看,这似乎应该起作用。

比方说,我已经得到了包括这些领域的典范:

vscore = models.PositiveSmallIntegerField(blank=True,null=True, 
              verbose_name="Visitors Score") 
hscore = models.PositiveSmallIntegerField(blank=True,null=True, 
              verbose_name="Home Score") 

而且我使用这段代码从它那里得到一些数据:

vstats = Game.objects.filter(start_et__range=[start,end], 
            ).values(
            'vteam').annotate(
             vgames=Count('vteam'), 
             vscore=Sum('vscore'), 
             hscore=Sum('hscore'), 
             vscoreAVG=Avg('vscore'), 
             hscoreAVG=Avg('hscore')).extra(
        select={'vwins': "sum(vscore>hscore)"}) 

它工作正常,除了extra(),我用它来获取vscore大于hscore的行数。我在结果字典中甚至没有获得钥匙,所以我猜测我不知道怎么使用这个权利。这就是我完全不解的地方,因为我从the documentation直接复制粘贴这个,并修改了SQL位以适应我的需要。为什么vstats字典中不包含vwins密钥?

回答

0

你的问题是与values() method

下面是来自Django文档相关报价:

如果您使用的值()子句一个额外的()调用之后,)由额外的一个选择参数(定义的任何字段都必须明确列入在values()调用中。在value()调用后进行的任何extra()调用将忽略其额外选定的字段。

所以你可能想要的是:

vstats = Game.objects.filter(start_et__range=[start,end], 
           ).annotate(
            vgames=Count('vteam'), 
            vscore=Sum('vscore'), 
            hscore=Sum('hscore'), 
            vscoreAVG=Avg('vscore'), 
            hscoreAVG=Avg('hscore')).extra(
       select={'vwins': "sum(vscore>hscore)"}).values(
           'vteam', 'vwins', 'vgames', 'vscore', 'hscore', 
           'vscoreAVG', 'hscoreAVG') 

这个查询将包括你的SELECT子句中想要的代码,但它会失败,因为它会产生不正确的SQL代码。

+0

谢谢!我认为这是工作原因/但现在Django的说有一个数据库错误 - “函数总和(布尔)不存在”,这不能是真正的'因为PostgreSQL 9.0文档说有http:// www。 postgresql.org/docs/9.0/static/functions-aggregate.html – Zamphatta 2013-05-05 20:50:22