0

我正在使用 Python 3.2.3、Django 1.5 和 PostgreSQL。

我一定不了解有关使用的东西.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 的行数。我什至没有vwins在结果字典中得到一个键,所以我猜我在某种程度上没有使用这个权利。这就是我完全困惑的地方,因为我直接从文档中复制并粘贴了它并更改了 SQL 位以满足我的需要。为什么vstats字典不包含vwins键?

4

1 回答 1

0

你的问题在于values()方法

这是来自 Django 文档的相关引用:

如果在 extra() 调用之后使用 values() 子句,则由 extra() 中的 select 参数定义的任何字段都必须显式包含在 values() 调用中。在 values() 调用之后进行的任何 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的代码。

于 2013-04-29T16:24:19.053 回答