Django get distinct на основе группы полей строк

У меня есть модель, которая хранит почтовые журналы. Я хочу отправить одно основное письмо и два письма с напоминаниями. Я разделил почтовые журналы по типу. (first_email, first_reminder_email, second_reminder_email). Нужны записи, которым мы отправили все три письма.

Моя модель

class MailLog(models.Model):

    MAIL_TYPE = (
        ('first_email', 'First Email'),
        ('first_reminder_email', 'First Reminder Email'),
        ('second_reminder_email', 'Second Reminder Email'),
    )
    user = models.ForeignKey('user.User', on_delete=models.CASCADE, blank=True, null=True, related_name='user_mail_log')
    category = models.IntegerField()  #  to store category
    mail_type = models.CharField(choices=MAIL_TYPE, max_length=100)

Я хочу группировать по категории, пользователю и типу_почты (должен быть статус всех трех)

Данные выборки

| id | user | category | mail_type |
----------------------------------- 
| 1 |  20   | 4        | first_email |
| 2 |  20   | 4        | first_reminder_email |
| 3 |  20   | 4        | second_reminder_email |
| 4 |  20   | 5        | first_email |
| 5 |  22   | 4        | first_email |
| 6 |  22   | 4        | first_reminder_email |

Я пробовал несколько подходов

MailLog.objects.filter(Q(category__id=6) & Q(mail_type='first_email') & Q(mail_type='first_reminder_email') & Q(mail_type='second_reminder_email') )


MailLog.objects.values_list('user', 'category').distinct(

Вы можете использовать Count с Concat.

Предположим, что user_id, mail_type и category не являются уникальными вместе:

from django.db.models import Count
from django.db.models.functions import Concat

MailLog.objects
    .filter(category=1)
    .values('user_id')
    .annotate(unique_mail_type_count=Count(Concat('user_id', 'mail_type'), distinct=True))
    .filter(unique_mail_type_count=3)
Вернуться на верх