返回多对多关系的额外字段而不是另一个
Posted
技术标签:
【中文标题】返回多对多关系的额外字段而不是另一个【英文标题】:Return extra fields of many-to-many relationship instead of another 【发布时间】:2017-10-23 20:45:45 【问题描述】:我的问题基于 Django 文档中给出的 this 示例。我的 models.py 看起来像这样:
class Wrestler(models.Model):
name = CharField(max_length=255)
class AlterEgo(models.Model):
name = CharField(max_length=255)
person = ForeignKey('someapp.Person', )
class Group(models.Model):
name = CharField(max_length=255)
members = models.ManyToManyField('someapp.Person', through='Membership')
class Membership(models.Model):
person= models.ForeignKey('someapp.Person',)
alter_ego = models.ForeignKey('someapp.AlterEgo', blank=True, null=True)
group = models.ForeignKey('someap.Group',)
我的群组列表模板如下所示:
% for object in object_list %<tbody>
<tr>
<td><a href="object.get_absolute_url"> object.name </a></td>
<td> object.members.all|join:" & " </td>
</tr>
</tbody>% endfor %
如您所见,我的额外字段是“alter_ego”字段。每个人都可以有另一个自我,例如。 G。 Chris Jericho 曾经扮演 Moongoose McQueen。使用此模板,成员将被列为“Chris Jericho & Richard Ward & ...”。我的问题是我不希望 Jericho 被列为 Jericho 而是 McQueen,如果给出了另一个自我。
我想如果给定了另一个自我,我应该有一个自定义函数来替换我的人 FK,但我仍然试图绕着它转,因为我对这一切真的是个菜鸟。
如果有人能指出我正确的方向,我将不胜感激。提前致谢。
【问题讨论】:
你应该将 alter_ego 添加到 Person 模型中,然后修改 Person 的 str 函数,该函数应该返回正确的名称 - 如果存在则 alter_ego,否则返回 username。 我考虑过这个选项,但我假设一个人可以有多个改变自我,例如。 G。 Marshall Mathers 被称为 Eminen 和/或 Slim Shady,Sean Combs 被称为 Diddy、P. Diddy、Puff Daddy、Sean John,并且每个人都可以成为具有不同另一个自我的团体的一部分。 【参考方案1】:从会员中删除 alter_ego。
更改 AlterEgo 类并添加相关名称:
类 AlterEgo(models.Model):
name = CharField(max_length=255)
person = ForeignKey('someapp.Person', related_name = 'alter_ego')
group = ForeignKey('someapp.Group', blank=True, null=True)
在模板中迭代成员:
<td>
% for member in group.members.all %
% if member.alter_ego.group == group
member.alter_ego
% else %
member.name
% endif %
% endfor %
</td>
附:您的小任务是从模板中的名称形成字符串并用 & 分隔
【讨论】:
谢谢,很有魅力!模板标签首先返回 someapp.AlterEgo.None 帽子,但这可以解决。不过,这并不是我想要的。也许我把它复杂化了。您的标签返回了 Person 拥有的每个另一个自我,而不仅仅是我会在中间添加的那个。应该是这样的:A 人有 Alter Ego A 和 B。他和 Alter Ego A 属于 A 组,和 Alter Ego B 属于 B 组。B 和 C 没有 Alter Ego。示例:我的列表应如下所示:A 组 / Alter Ego A & Person B. Group B / Alter Ego B & Person C. @Everlong 那么你对组有额外的依赖,你可以将它添加到 AlterEgo 类。默认为null,因此当用户加入组时,他还应该选择他将在组中使用的alter ego(或者您为用户定义它)然后在模板中您可以检查alter ego group是否等于组您为其输出名称。查看我编辑的答案以上是关于返回多对多关系的额外字段而不是另一个的主要内容,如果未能解决你的问题,请参考以下文章