Django: Можно ли выбрать уникальные комбинации двух внешних ключей без использования distinct?

У меня есть следующие модели:

class Exercise(models.Model):
    name = models.CharField(max_length=300)
    # ...

class UserWorkout(models.Model):
    user = models.ForeignKey(User)
    # ...

class WorkoutSet(models.Model):
    exercise = models.ForeignKey(Exercise)
    user_workout = models.ForeignKey(UserWorkout, related_name="sets")
    date_time = models.DateTimeField(default=timezone.now)
    weight = models.DecimalField(max_digits=10, decimal_places=6)
    # ...

Вот пример данных для модели WorkoutSet, чтобы получить более полное представление:

ID    weight     DateTime     Exercise    UserWorkout
-     10.0       22/02/2022   3           UUID('755925da-9a43-490c-9ffa-3222acd1dcfa')
-     15.0       22/02/2022   3           UUID('755925da-9a43-490c-9ffa-3222acd1dcfa')
-     15.0       22/02/2022   3           UUID('755925da-9a43-490c-9ffa-3222acd1dcfa')
-     55.0       24/02/2022   5           UUID('bc59c55b-9adc-47c7-9790-2e5d8b21f956')
-     57.5       24/02/2022   5           UUID('bc59c55b-9adc-47c7-9790-2e5d8b21f956')
-     15.0       24/02/2022   3           UUID('bc59c55b-9adc-47c7-9790-2e5d8b21f956')
-     20.0       24/02/2022   3           UUID('bc59c55b-9adc-47c7-9790-2e5d8b21f956')

Я пытаюсь отфильтровать эти данные, чтобы они показывали, сколько раз было выполнено каждое упражнение (т.е. сколько тренировок с ним связано). Таким образом, вышеприведенные данные будут выглядеть следующим образом:

Exercise    UserWorkout
3           UUID('755925da-9a43-490c-9ffa-3222acd1dcfa')
5           UUID('bc59c55b-9adc-47c7-9790-2e5d8b21f956')
3           UUID('bc59c55b-9adc-47c7-9790-2e5d8b21f956')

В конечном итоге я собираюсь подсчитать, сколько раз каждое упражнение было выполнено следующим образом:

qs = # some filter statement

qs = qs.values('exercise').annotate(frequency=Count('exercise'))

Я не могу использовать distinct, потому что он не работает с annotate:

NotImplementedError: annotate() + distinct(fields) не реализовано.

Возможно ли то, чего я пытаюсь достичь? Возможно, через подзапрос? Мой SQL ржавый, поэтому не уверен, что это вообще возможно.

Вернуться на верх