首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在管理或视图中自引用对称的多个Django模型

在管理或视图中自引用对称的多个Django模型
EN

Stack Overflow用户
提问于 2018-07-09 23:22:13
回答 1查看 1.1K关注 0票数 2

如何在M2M django模型中得到对称自引用的另一面?

假设我们正在制作一个部件目录,我们有大量的Part,我们希望有一个Interchange来显示哪些部件可以用来代替其他部件:

代码语言:javascript
复制
class Part(models.Model):
    name = models.CharField(max_length=300)
    number = models.CharField(max_length=200, default 'because numberphiles like more ids')
    …
    interchanges = models.ManyToManyField("self",
                                          through='Interchange',
                                          symmetrical=False,
                                          # + sign per http://charlesleifer.com/blog/self-referencing-many-many-through/
                                          # I have tried without the plus t omaintain the references as well, but can't seem to understand the difference(s)
                                          related_name="interchanges_to+",
                                          # through_fields per docs
                                          through_fields=('reference', 'interchange')
                                          )

    # per this http://charlesleifer.com/blog/self-referencing-many-many-through/
    def add_interchange(self, part, symm=True):
        interchange = models.Interchange.objects.get_or_create(
            reference_part=self,
            interchange_part=part)
        if symm:
            # avoid recursion by passing `symm=False`
            part.add_interchange(self, False)
        return interchange

    def remove_interchange(self, part, symm=True):
        models.Interchange.objects.filter(
            reference_part=self,
            interchange_part=part).delete()
        if symm:
            # avoid recursion by passing `symm=False`
            part.remove_interchange(self, False)

    def get_interchanges(self):
        return ", ".join([str(p) for p in self.interchanges.filter(interchange_part__reference=self)])

    def get_references(self):
        return …?
        # This is where I don't know how to get the Parts that are referring to it as being an interchange

class Interchange(models.Model):
    reference = models.ForeignKey(Part, related_name="reference_part")
    interchange = models.ForeignKey(Part, related_name="interchange_part")
    # just to confirm we have a M2M table, we will add a foregin key to a User if this interchange has been personally verified
    confirmed_by = models.ForeignKey(User, null=True, blank=True)
    # … others if needed

    class Meta:
        # because self-referencing, in this case, is silly, we make sure each part references another part
        unique_together = ('reference', 'interchange')

在Django管理中,我有:

代码语言:javascript
复制
@admin.register(app.Part)
class PartAdmin(admin.ModelAdmin):
    list_display = ['name', 
                    'number', 
                     # ▼ I can see the Parts itself Interchanges to
                    'get_interchanges', 
                     # ▼ I can not see the Parts that reference itself as being an Interchange
                    'get_references'] 

管理中的部件模型以供参考..。

以下是我所拥有的:

以下是我想要得到的:

作为确认,管理中的交换模型:

如何得到对称自引用的M2M django模型的另一面?

如何返回位于交换表中但在引用(第一)列**中的Part**s

备注:

  • 使用django 1.11
  • 我知道当使用False通过模型M2M时,文档的对称性是必需的
  • 不错的编写帮助我取得了相当大的进步,但在管理方面,我似乎无法让interchange_part在管理页面中显示其reference_part(因此,我甚至没有尝试过在具有不同/特定功能的视图中显示它是否可行)。
  • 文档中,它说明了用于through_keys的元组的第二部分称为target模型,但我无法找到引用第一个模型的方法。
  • 我确信有一种方法可以深入到多个层次,即如果第一部分转换为2和2 => 3,那么1应该列出2和3(但这不是目前的重点)。
  • 请纠正我的误解,谢谢:)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-10 00:26:20

如果manytomany有一个带有related_name参数的直通表,并且不包括+,那么您可以直接访问该集合:

代码语言:javascript
复制
def get_references(self):
    return ", ".join([str(p) for p in self.interchanges_to.all()])

注意,我不确定性能/复杂性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51255253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档