简体   繁体   English

Django 从视图中的related_name 访问manytomany 字段

[英]Django access manytomany field from related_name in a view

I have what i think is a simple question but I am struggling to find out how it works.我有一个我认为是一个简单的问题,但我正在努力找出它是如何工作的。 I get how related name works for foreign keys but with many to many fields it seems to break my brain.我知道外键的相关名称是如何工作的,但是对于很多领域,这似乎让我大吃一惊。

I have two 3 models at play here.我在这里有两个 3 模型在玩。 A User, TeamMember and Team Model as seen below.一个用户、TeamMember 和 Team Model,如下所示。

User model is the built in django model.用户 model 是内置 django model。

#TeamMember Model
class TeamMember(models.Model):
    member = models.ForeignKey(User, on_delete=models.SET(get_default_team_member), verbose_name='Member Name', related_name="team_members")
    ...

#Team Model
class Team(models.Model):
    name = models.CharField(max_length=50)
    manager = models.ForeignKey(TeamMember, on_delete=models.SET_NULL, related_name="managers", null=True, blank=True)
    team_lead = models.ForeignKey(TeamMember, on_delete=models.SET_NULL, related_name="tls", null=True, blank=True)
    tps = models.ForeignKey(TeamMember, on_delete=models.SET_NULL, related_name="tps",  null=True, blank=True)
    members = models.ManyToManyField(TeamMember, blank=True, related_name="members")
    ...

Now in a view i want to access a specific users team.现在在一个视图中,我想访问一个特定的用户团队。 I thought i could do this by doing something like this:我想我可以通过做这样的事情来做到这一点:

member = TeamMember.objects.get(pk=1)
member_team = member.members.name

However if I print member_name than it prints nothing.但是,如果我打印member_name ,则它什么也不打印。 If I try to access any of the other fields on that model like member.members.team_lead.first_name it fails to find the team_lead field.如果我尝试访问该 model 上的任何其他字段,例如member.members.team_lead.first_name ,它将无法找到team_lead字段。 I understand that this has a .all() attribute but i thought it was tied to the team object through the members field.我知道这有一个.all()属性,但我认为它通过成员字段与团队 object 相关联。 So if that member matches the team it would give me the team.因此,如果该成员与团队匹配,它将给我团队。 So I thought it might be an issue if the same member was linked to more than one team (which is possible) so i tired something like this member.members.all().first().name and i get an error that states it cannot get name from NoneType.所以我认为如果同一个成员与多个团队相关联(这是可能的)可能是一个问题,所以我厌倦了类似这样member.members.all().first().name并且我收到一个错误消息它无法从 NoneType 获取名称。

Is there an easy way to get the team name from a relationship like this or am i better off just doing a team query with the user?有没有一种简单的方法可以从这样的关系中获取团队名称,或者我最好只与用户进行团队查询?

Thanks, jAC谢谢,江淮

First of all, I would like to point out that you are not using the related_name (and related_query_name parameters in a proper way).首先,我想指出您没有以正确的方式使用related_name (和related_query_name参数)。 I think this SO post will help you to understand the concept in a better way.我认为这篇 SO 帖子将帮助您更好地理解这个概念。

So, I would change the related_name (and related_query_name ) values in the Team model as below,因此,我将更改Team related_name中的相关名称(和相关related_query_name名称)值,如下所示,

class Team(models.Model):
    name = models.CharField(max_length=50)
    manager = models.ForeignKey(
        TeamMember,
        on_delete=models.SET_NULL,
        related_name="teams", related_query_name="team",
        null=True,
        blank=True,
    )
    team_lead = models.ForeignKey(
        TeamMember,
        on_delete=models.SET_NULL,
        related_name="teams", related_query_name="team",
        null=True,
        blank=True,
    )
    tps = models.ForeignKey(
        TeamMember,
        on_delete=models.SET_NULL,
        related_name="teams", related_query_name="team",
        null=True,
        blank=True,
    )
    members = models.ManyToManyField(
        TeamMember, blank=True, related_name="teams", related_query_name="team"
    )
    ...

Now in a view i want to access a specific user's team.现在在一个视图中,我想访问特定用户的团队。

Since the Team and TeamMember models are connected via ManyToManyField , you may have "zero or more" Team s associated with a single TeamMember由于TeamTeamMember模型通过ManyToManyField连接,因此您可能有“零个或多个” Team与单个TeamMember关联

So, the following query will get you all the teams associated with a particular TeamMemeber因此,以下查询将为您提供与特定TeamMemeber关联的所有团队

team_member = TeamMember.objects.get(pk=1)
all_teams = team_member.teams.all()

You can also iterate over the QuerySet as,您还可以将 QuerySet 迭代为,

team_member = TeamMember.objects.get(pk=1)
for team in team_member.teams.all():
    print(team.name)

For anyone wondering what I did based on JPG's advice was the for loop option对于任何想知道我根据 JPG 的建议做了什么的人是 for 循环选项

team_member = TeamMember.objects.get(pk=1)
teams = [t.name for t in team_member.members.all()]

I personally do not care which team i get as my need in this case is just to pass a team through even if it is none.我个人不在乎我得到哪个团队,因为在这种情况下我需要的只是让一个团队通过,即使它没有。 So i just use team = team[0] if teams.count() > 0 else "No team"所以我只使用team = team[0] if teams.count() > 0 else "No team"

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

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