Ecco un esempio del problema e una soluzione alternativa per risolvere il problema. Prendete questo esempio modello:
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')
Questo esempio query di aggregazione non riesce allo stesso modo ai suoi perché tenta di fare riferimento a un valore diverso da campo creato utilizzando .extra()
.
User.ratings_received.extra(
select={'percent_positive': 'ratings > 3'}
).aggregate(count=Avg('positive'))
Una soluzione Soluzione
Il valore desiderato può essere trovato direttamente utilizzando la funzione di database di aggregazione (Med in questo caso) entro la definizione del valore aggiunto:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
)
Questa query genererà la seguente query 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
Nonostante le colonne non necessarie in questa query, possiamo ancora ottenere il valore desiderato da esso isolando il valore percent_positive
:
User.ratings.extra(
select={'percent_positive': 'AVG(rating >= 3)'}
).values('percent_positive')[0]['percent_positive']
Dovresti mostrare i tuoi modelli, probabilmente. Il QS funziona senza l'aggregazione? –
Sì, 'player.game_objects.extra (select = {'week': 'WEEK (games_game.date)'}) [0] .week' fornisce' 43L' come previsto. – Jake
I miei modelli sono abbastanza complessi, questa è una semplificazione del mio problema. Se aiuta posso scrivere un caso di prova con modelli semplici. – Jake