Ho un'app django che sta registrando. Il mio modello è simile al seguente:Conteggio aggregato Django con numero di record al giorno
class MessageLog(models.Model):
logtime = models.DateTimeField(auto_now_add=True)
user = models.CharField(max_length=50)
message = models.CharField(max_length=512)
Che voglio fare è ottenere il numero medio di messaggi registrati per ogni giorno della settimana in modo che posso vedere quali giorni sono i più attivi. Sono riuscito a scrivere una query che tira il numero totale di messaggi al giorno, che è:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).count()
ma sto avendo problemi a calcolare la media in una query. Quello che ho adesso è:
for i in range(1, 8):
MessageLog.objects.filter(logtime__week_day=i).annotate(num_msgs=Count('id')).aggregate(Avg('num_msgs'))
Per qualche motivo, tuttavia, restituisce 1.0 per ogni giorno. Ho guardato lo SQL si sta generando ed è:
SELECT AVG(num_msgs) FROM (
SELECT
`myapp_messagelog`.`id` AS `id`, `myapp_messagelog`.`logtime` AS `logtime`,
`myapp_messagelog`.`user` AS `user`, `myapp_messagelog`.`message` AS `message`,
COUNT(`myapp_messagelog`.`id`) AS `num_msgs`
FROM `myapp_messagelog`
WHERE DAYOFWEEK(`myapp_messagelog`.`logtime`) = 1
GROUP BY `myapp_messagelog`.`id` ORDER BY NULL
) subquery
Credo che il problema potrebbe essere provenienti da GROUP BY id ma non sono davvero sicuro. Qualcuno ha qualche idea o suggerimento? Grazie in anticipo!
Grazie per la spiegazione! Questo ha molto senso. Ho provato a utilizzare la clausola extra, tuttavia ora sto ottenendo un errore SQL. Ho modificato la mia richiesta di essere: MessageLog.objects.filter (logtime__week_day = i) .extra ({'date_logged': "date (logtime)"}). Values ('date_logged') .annotate (num_msgs = Count ('id')) .aggregate (Avg ('num_msgs')) E l'errore che ricevo è "Hai un errore nella sintassi SQL, controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta a usa vicino a 'FROM (SELECT (data (logtime)) AS date_logged', COUNT ('myapp_messagelog' .id' alla riga 1") – bb89
Sì, non funziona, vero? La clausola aggregata la butta via - it funziona fino all'annotazione. Puoi ottenere un conteggio del numero totale di messaggi per coppia di giorni della settimana in modi diversi, ma non riesco a trovare un modo per fare in modo che l'ORM di Django faccia questo in un'unica chiamata. quello che ho inventato h nella mia risposta. –
Alla fine ho creato una vista (effettivamente necessaria 2 per mysql) e quindi un modello non gestito come suggerito e ha funzionato perfettamente. Aggiungerò un altro post che spiega cosa ho fatto in seguito per quelli che potrebbero essere interessati. Grazie ancora per tutto il vostro aiuto! – bb89