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.
由于 Team
和 TeamMember
模型通过 ManyToManyField
连接,您可能 “零个或多个” Team
s 与单个 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"
我有一个我认为很简单的问题,但我正在努力找出它是如何工作的。我了解相关名称如何用于外键,但对于许多字段,它似乎让我的大脑崩溃。
我这里有两个 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.
由于 Team
和 TeamMember
模型通过 ManyToManyField
连接,您可能 “零个或多个” Team
s 与单个 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"