Hier ist ein Beispiel für das Problem und eine ideale Lösung. Nehmen Sie dieses Beispiel Modell:
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')
Dieses Beispiel Aggregat Abfrage wie bei Ihnen in der gleichen Art und Weise versagt, weil es ein nicht-Feldwert geschaffen zu verweisen versucht, mit .extra()
.
User.ratings_received.extra(
select={'percent_positive': 'ratings > 3'}
).aggregate(count=Avg('positive'))
Eine Umgehungslösung
Das kann gewünschter Wert direkt unter Verwendung der aggregierten Datenbankfunktion (Avg in diesem Fall) in der Mehrwert-Definition gefunden:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
)
Diese Abfrage generiert die folgende SQL-Abfrage:
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
Trotz der nicht benötigten Spalten in dieser Abfrage, können wir immer noch den gewünschten Wert von ihm erhalten, indem die percent_positive
Wert zu isolieren:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
).values('percent_positive')[0]['percent_positive']
Sie sollten Ihre Modelle wahrscheinlich zeigen. Arbeitet das QS ohne die Aggregation? –
Ja, 'player.game_objects.extra (select = {'woche': 'WEEK (games_game.date)'}) [0] .week' ergibt' 43L' wie erwartet. – Jake
Meine Modelle sind ziemlich komplex, das ist eine Vereinfachung meines Problems. Wenn es hilft, könnte ich einen Testfall mit einfachen Modellen schreiben. – Jake