如何在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()

这将在Workout模型上创建一个LEFT OUTER JOIN,因此当(且仅当)至少有一个相关的Workout对象时检索Members。.distinct()将防止多次返回相同的Member

成员后面的User模型也可以用:

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

如果您只是想检索所有成员,您可以使用Member.objects.all()并因此渲染这些,然后确保可以单击链接以获取该Member的详细信息。

最新更新