这是问题的示例和不理想的解决方法。以这个示例模型为例:
class Rating(models.Model):
RATING_CHOICES = (
(1, '1'),
(2, '2'),
(3, '3'),
(4, '4'),
(5, '5'),
)
rating = models.PositiveIntegerField(choices=RATING_CHOICES)
rater = models.ForeignKey('User', related_name='ratings_given')
ratee = models.ForeignKey('User', related_name='ratings_received')
此示例聚合查询以与您相同的方式失败,因为它尝试引用使用创建的非字段值.extra()
。
User.ratings_received.extra(
select={'percent_positive': 'ratings > 3'}
).aggregate(count=Avg('positive'))
一种解决方法
可以通过在额外值的定义中使用聚合数据库函数(在本例中为 Avg)直接找到所需的值:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
)
此查询将生成以下 SQL 查询:
SELECT (AVG(rating >= 3)) AS `percent_positive`,
`ratings_rating`.`id`,
`ratings_rating`.`rating`,
`ratings_rating`.`rater_id`,
`ratings_rating`.`ratee_id`
FROM `ratings_rating`
WHERE `ratings_rating`.`ratee_id` = 1
尽管此查询中有不需要的列,我们仍然可以通过隔离值从中获取所需的percent_positive
值:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
).values('percent_positive')[0]['percent_positive']