Как подсчитать количество строк с одинаковой датой, но разного типа?

У меня есть такая модель:

class Class(models.TextChoices):
    STANDARD = "Standard", _("Standard")
    JWW = "JWW", _("JWW")

class Competition(models.Model):
    cls = models.CharField(choices=Class.choices)
    date = models.DateField()

Я хотел бы получить все даты, в которые произошли стандартные Competition и JWW Competition. Мое текущее решение занимает много времени для небольшого количества строк (~300) и полагается на intersection запрос.

У меня есть большой объем данных, на основе которых нужно будет выполнить расчет, поэтому чем быстрее запрос, тем лучше. Память не имеет значения.

Текущее решение:

base_runs = (
    Competition.objects
    .filter(cls__in={Class.JWW, Class.STANDARD})
    .values("date", "cls")
)

JWW_runs = base_runs.filter(cls=Class.JWW)
standard_runs = base_runs.filter(cls=Class.STANDARD)
return JWW_runs.intersection(standard_runs).values("date").distinct().count()
Вернуться на верх