Devo compilare un modello con un riepilogo dell'attività dell'utente in un semplice sistema di messaggistica. Per ciascun mittente del messaggio, desidero il numero di messaggi inviati e il numero di destinatari distinti.Versione ORM di Django di SQL COUNT (DISTINCT <column>)
Ecco una versione semplificata del modello:
class Message(models.Model):
sender = models.ForeignKey(User, related_name='messages_from')
recipient = models.ForeignKey(User, related_name='messages_to')
timestamp = models.DateTimeField(auto_now_add=True)
Ecco come lo farei in SQL:
SELECT sender_id, COUNT(id), COUNT(DISTINCT recipient_id)
FROM myapp_messages
GROUP BY sender_id;
Ho letto attraverso la documentazione sull'aggregazione nelle query ORM, e sebbene annotate() sia in grado di gestire la prima colonna COUNT, non vedo un modo per ottenere il risultato COUNT (DISTINCT) (anche extra (select = {}) non ha funzionato, anche se sembra come dovrebbe). Questo può essere tradotto in una query ORG di Django o dovrei limitarmi a SQL raw?
Il [ ' .distinct() '] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct) filter potrebbe com e utile. –
Se ignoriamo il COUNT (DISTINCT recipient_id) è piuttosto semplice usare le funzioni annotate e Count. Qui, il distinto() di django non aiuta. Non penso sia possibile integrare queste due cose (annotate e distinte) insieme. Devi scrivere due domande, credo. – jurgenreza