【问题标题】:Django-mptt and multiple parents?Django-mptt 和多个父母?
【发布时间】:2011-04-26 19:58:15
【问题描述】:

在这个问题上我已经把头撞在桌子上几个星期了,所以我想是时候寻求帮助了。

我正在尝试实现一个数据库结构,其中包含装配零件的分层数据。我的主要问题在于试图将一个“子程序集”分配给另一个“程序集”/树。参考下面的示例树 - 我在创建和使用程序集 1 和 2 时没有问题。但是当我制作程序集 3 时,当我调用子程序集时,我得到多个对象返回错误(我理解基于我的方式尝试)。

assembly 1:    assembly 2:     assembly 3:
1.1            2.1             2.1
- 1.1.1        - 2.1.1         - 2.1.1
1.2            2.2             1.2
- 1.2.1        - 2.2.1         - 1.2.1               

这是我一直在尝试的模型:

#models.py snippet
class Part(models.Model):
        part_name = models.CharField(max_length=30, primary_key=True)
        description = models.TextField(max_length=500, blank=True, null=True)
        revision = models.CharField(max_length=10, blank=True, null=True)

        def __unicode__(self):
                return u'%s' % (self.part_name)

class Assembly(MPTTModel):
        name = models.ForeignKey(Part)
        parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

        def __unicode__(self):
                return u'%s' % (self.name)

#views.py snippet
def assembly_details(request, assembly_name):
        context_instance=RequestContext(request)
        assembly = Assembly.objects.get(name=assembly_name)
        descendants_list = assembly.get_descendants(include_self=False)
        return render_to_response('assembly_details.html', locals(), context_instance,)

所以基本上我正在创建非常基本的树并通过 Part FK 链接到更详细的数据。我需要能够查询任何程序集并查看它的后代 - 所以虽然我可以调用程序集 3,但我不能调用任何已经在多棵树中的孩子。

对于我正在做的事情,从树中的任何给定点开始,向下总是相同的,即 1.2 总是有一个 1.2.1 的孩子,但向上可以改变,即 1.2 可以有一个父母1 和/或 3。

问题是让 Assembly.parent 成为 ForeignKey,因为它将其限制为一个值。关于一些解决方案或尝试的事情有什么想法吗?

如果您想查看其他代码或提出问题,请告诉我。这似乎是一个难以解释清楚的话题!谢谢

----编辑----

我发现我需要一个有向无环图 (DAG) 模型。

我还没有具体的解决方案,但是当我弄清楚或提出 DAG 问题时,我会尝试在此处发布链接。


----编辑 2----

django-treebeard-dag

django-dag

我发现了这两个非常小的项目。我最初使用的是“treebeard”版本,然后为我的项目切换到 django-dag。如有关于基本使用的问题,请随时 PM,我会看看是否可以提供帮助。

【问题讨论】:

  • 你在这两个项目中的任何一个上都有收获吗?
  • 我一直在使用django-dag。基本上,我使用它作为我的结构的主干,然后添加我自己的模型以在每个组件的基础上添加额外的细节。我刚刚将我的基本模型添加到 djangosn-ps here 如果你想要一个示例来开始
  • 你为什么从 django-treebeard-dag 切换到 django-dag?我目前正在评估这两个包。
  • 我认为使用 treebeard-dag 我在通过工厂开始时遇到了麻烦。我不知道这是我的数据格式化方式还是代码不够健壮。我通常对这个话题感到沮丧,而且仍然是一个初学者程序员,所以我选择了最容易工作的方法。
  • 我在零件/组件方面面临完全相同的问题,想知道您是否成功使用 django-dag?

标签: django django-models django-mptt


【解决方案1】:

我认为 Django-mptt 对于这项特殊工作来说是错误的工具。它处理树,在数据结构中作为树的一部分是节点有一个父节点,或者节点是树的根。

树是Graphs 的广义形式。我知道没有 Django 应用程序可以帮助您处理这些问题。

您可能不得不求助于维护自己的多对多关系并放弃 Django-mptt 的便利性。

【讨论】:

  • 那么谁来写一个 Graph 包呢? ;)
  • 好吧,我发现我需要一个 DAG 来解决这个问题。我发现了几个小项目,但没有得到很好的维护或记录。谢谢你的领导,埃文。
  • 不是 Django 特定的,看看 networkx 作为一个图形库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多