返回多对多关系的额外字段而不是另一个

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是否等于组您为其输出名称。查看我编辑的答案

以上是关于返回多对多关系的额外字段而不是另一个的主要内容,如果未能解决你的问题,请参考以下文章

反对 js:无法使用连接表额外属性更新多对多关系。说附加属性无效

多对多关系连接表上的sails.js 额外字段

在 django 的多对多关系中添加额外的字段

具有额外多对多关系的 JPA 多对多

创建多对多表关系的三种方式

Django 模型 - 至少多对多之一