Oto przykład problemu i unideal obejście problemu. Weźmy ten przykład modelu:
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')
Ten przykład kwerenda agregat nie w taki sam sposób jak ty, ponieważ próbuje odwoływać się do wartości spoza pola tworzone przy użyciu .extra()
.
User.ratings_received.extra(
select={'percent_positive': 'ratings > 3'}
).aggregate(count=Avg('positive'))
Jeden Obejście Rozwiązanie
Żądaną wartość można znaleźć bezpośrednio za pomocą funkcji zagregowanego bazy danych (średnio w tym przypadku) w ramach definicji dodatkową wartość w:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
)
To zapytanie będzie generować następujące zapytanie 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
Pomimo niepotrzebnych kolumn w tym zapytaniu, nadal możemy uzyskać żądaną wartość z niej przez wyodrębnienie wartości percent_positive
:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
).values('percent_positive')[0]['percent_positive']
Powinieneś prawdopodobnie pokazać swoje modele. Czy QS działa bez agregacji? –
Tak 'player.game_objects.extra (select = { 'tydzień' 'tydzień (games_game.date)'}) [0] .week' daje' 43L' prawidłowo. – Jake
Moje modele są dość złożone, to jest uproszczenie mojego problemu. Jeśli to pomoże, mogę napisać test z prostymi modelami. – Jake