简体   繁体   English

如何在Django中过滤多对多关系中的不同对象?

[英]How to filter distinct objects in a many-to-many relationship in Django?

I have a page where I show all workout plans from each user.我有一个页面,其中显示每个用户的所有锻炼计划。 But I want to show only one entry per user, so then I can click and get all workouts plans of that user.但我只想为每个用户显示一个条目,这样我就可以单击并获取该用户的所有锻炼计划。 So, instead of showing:所以,而不是显示:

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

I want to show:我想展示:

User 1
User 2

I was using the following view:我正在使用以下视图:

planos = Workout.objects.all()

But this would show everything, so I tried:但这会显示一切,所以我尝试了:

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

But this returns {'member': 1} and {'member': 2} .但这会返回{'member': 1}{'member': 2}

How can I access the name of the user?如何访问用户名?

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)

You filter on the Member model:您筛选Member model:

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

This will make a LEFT OUTER JOIN on the Workout model, and thus retrieve Member s if (and only if) there is at least one related Workout object. The .distinct() will prevent that the same Member is returned multiple times.这将在Workout model 上进行左外连接,因此当(且仅当)至少有一个相关Workout object 时检索Member.distinct()将防止多次返回同一Member

We can also obtain the User models behind that member with:我们还可以通过以下方式获取该成员背后的User模型:

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

If you simply want to retrieve all members, you can work with Member .objects.all() and thus render these, and then ensure that one can click a link to get details for that Member .如果您只想检索所有成员,您可以使用Member .objects.all()并呈现这些成员,然后确保可以单击链接以获取该Member的详细信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM