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

Django access manytomany field from related_name in a view

我有一个我认为很简单的问题,但我正在努力找出它是如何工作的。我了解相关名称如何用于外键,但对于许多字段,它似乎让我的大脑崩溃。

我这里有两个 3 模型在玩。如下所示的用户、团队成员和团队模型。

用户模型是内置的 django 模型。

#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")
    ...

现在在视图中我想访问特定的用户团队。我以为我可以通过做这样的事情来做到这一点:

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

但是,如果我打印 member_name,它什么也不会打印。如果我尝试访问该模型上的任何其他字段,如 member.members.team_lead.first_name,它找不到 team_lead 字段。我知道这有一个 .all() 属性,但我认为它通过成员字段绑定到团队对象。因此,如果该成员与团队匹配,它将给我团队。所以我认为如果同一个成员链接到多个团队(这是可能的),这可能是一个问题,所以我厌倦了这样的事情 member.members.all().first().name 并且我收到一条错误消息,指出它无法从 NoneType 获取名称。

有没有一种简单的方法可以从这样的关系中获取团队名称,还是我最好只与用户进行团队查询?

谢谢, 江淮

首先,我想指出您没有正确使用 related_name(和 related_query_name 参数)。我认为 this SO post 会帮助您更好地理解这个概念。

因此,我将 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,
        <b>related_name="teams",
        related_query_name="team",</b>
        null=True,
        blank=True,
    )
    team_lead = models.ForeignKey(
        TeamMember,
        on_delete=models.SET_NULL,
        <b>related_name="teams",
        related_query_name="team",</b>
        null=True,
        blank=True,
    )
    tps = models.ForeignKey(
        TeamMember,
        on_delete=models.SET_NULL,
        <b>related_name="teams",
        related_query_name="team",</b>
        null=True,
        blank=True,
    )
    members = models.ManyToManyField(
        TeamMember, blank=True, <b>related_name="teams", related_query_name="team"</b>
    )
    ...

Now in a view i want to access a specific user's team.

由于 TeamTeamMember 模型通过 ManyToManyField 连接,您可能 “零个或多个” Teams 与单个 TeamMember

关联

因此,以下查询将为您提供与特定 TeamMemeber

关联的所有团队
team_member = TeamMember.objects.get(pk=1)
all_teams = team_member.teams.all()

您还可以迭代 QuerySet 为,

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

对于任何想知道我根据 JPG 的建议做了什么的人来说,for 循环选项

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

我个人并不关心我得到哪个团队,因为在这种情况下我的需要只是让一个团队通过,即使它是none。所以我只使用 team = team[0] if teams.count() > 0 else "No team"