Muszę wypełnić szablon podsumowaniem aktywności użytkownika w prostym systemie przesyłania wiadomości. Dla każdego nadawcy wiadomości chcę liczbę wysłanych wiadomości i liczbę różnych odbiorców.Django ORM wersja SQL COUNT (DISTINCT)
Oto uproszczona wersja modelu:
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)
Oto jak zrobiłbym to w SQL:
SELECT sender_id, COUNT(id), COUNT(DISTINCT recipient_id)
FROM myapp_messages
GROUP BY sender_id;
Czytałem poprzez dokumentację na agregację w zapytaniach ORM, i chociaż funkcja annotate() może obsłużyć pierwszą kolumnę COUNT, nie widzę sposobu na uzyskanie wyniku COUNT (DISTINCT) (nawet dodatkowy (select = {}) nie działa, chociaż wydaje się, że powinien). Czy można to przetłumaczyć na zapytanie ORM Django, czy powinienem trzymać się surowego kodu SQL?
Sieć [ ' .distinct() '] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct) filter could com e przydaje się. –
Jeśli zignorujemy COUNT (DISTINCT recipient_id), jest to całkiem proste dzięki funkcji adnotacji i liczenia. W tym przypadku django's distinct() nie pomaga. Nie sądzę, że możliwe jest zintegrowanie tych dwóch rzeczy (opis i odrębność) razem. Musisz chyba napisać dwa zapytania. – jurgenreza