Как фильтровать различные объекты в отношениях "многие-ко-многим" в Django?

У меня есть страница, на которой я показываю все планы тренировок каждого пользователя. Но я хочу показать только одну запись для каждого пользователя, чтобы потом я мог щелкнуть и получить все планы тренировок этого пользователя. Поэтому вместо того, чтобы показывать:

User 1 - Day 1
USer 1 - Day 2
User 2 - Day 1
USer 2 - Day 2

Я хочу показать:

User 1
User 2

Я использовал следующий вид:

planos = Workout.objects.all()

Но это показывало все, поэтому я попробовал:

plan = Workout.objects.values('member').distinct()

Но это возвращает {'member': 1} и {'member': 2}.

Как я могу получить доступ к имени пользователя?

class Member(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    socio = models.CharField(max_length=6)
    address = models.CharField(max_length=200)
    city = models.CharField(max_length=200)
    

class Exercise(models.Model):
    exercise = models.CharField(max_length=166)
    series = models.CharField(max_length=2)
    reps = models.CharField(max_length=2)
    maquina = models.ForeignKey(Maquina)


class Workout(models.Model):
    member = models.ForeignKey(Membro)
    day = models.CharField(max_length=1)
    exercises = models.ManyToManyField(Exercise)

Вы фильтруете на модели Member:

Member.objects.filter(
    workout__isnull=False
).distinct()

Это сделает LEFT OUTER JOIN на модели Workout, и таким образом получит Member, если (и только если) есть хотя бы один связанный Workout объект. .distinct() предотвратит возврат одного и того же Member несколько раз.

Мы также можем получить User модели за этим членом с помощью:

User.objects.filter(
    member__workout__isnull=False
).distinct()

Если вы просто хотите получить все члены, вы можете работать с Member.objects.all() и таким образом отобразить их, а затем убедиться, что можно нажать на ссылку, чтобы получить подробную информацию для этого Member.

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