Ето пример за проблема и неидеално заобиколно решение. Вземете този примерен модел:
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']
person
Trey Hunner
schedule
03.03.2011
player.game_objects.extra(select={'week': 'WEEK(games_game.date)'})[0].week
дава43L
както се очаква. - person Jake   schedule 05.01.2011