我正在使用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
密钥,所以我猜我在某种程度上没有使用这个权利。这就是我完全困惑的地方,因为我直接从the documentation复制粘贴这个并改变了SQL位以满足我的需要。为什么vstats
字典不包含vwins
密钥?
答案 0 :(得分:0)
问题在于values()
method。
以下是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
代码。