Django-mptt和多个父母?

j_s*_*syk 9 django django-models django-mptt

在这个问题上,我一直在桌子上撞了几个星期,所以我觉得可能是时候寻求帮助了.

我正在尝试实现一个数据库结构,它具有程序集部件的分层数据.我的主要问题在于尝试将一个"子组件"分配给另一个"组件"/树.参考下面的示例树 - 我在创建和使用程序集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               
Run Code Online (Sandbox Code Playgroud)

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

#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,)
Run Code Online (Sandbox Code Playgroud)

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

对于我正在做的事情,从树中的任何给定点开始,下降将始终是相同的,即1.2将始终具有1.2.1的子项,但是上升可以改变,即1.2可以具有1和/的父项或3.

问题是Assembly.parent是一个ForeignKey,因为它将它限制为一个值.关于某些解决方案或事情的任何想法都要尝试

如果您想查看其他代码或提出问题,请与我们联系.这似乎是一个难以尝试清楚解释的主题!谢谢

- - 编辑 - -

我发现我需要一个有向的循环图(DAG)模型.

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


----编辑2 ----

Django的树胡-DAG

Django的DAG

我找到了这两个非常小的项目.我最初使用的是"treebeard"版本,然后切换到django-dag用于我的项目.如果有关于基本用法的问题,请随时与PM联系,我会看看是否可以提供帮助.

Eva*_*ter 12

我认为Django-mptt是这项工作的错误工具.它处理树,而数据结构中树的一部分是节点有一个父节点,或节点是树的根.

树木是一种广义形式图形.我知道没有Django应用程序可以帮助你处理这些问题.

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

  • 那么谁会写一个Graph包呢?;) (4认同)