Django-mptt和多个父母? [英] Django-mptt and multiple parents?

查看:120
本文介绍了Django-mptt和多个父母?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这个问题上一直撞在桌子上几个礼拜,所以我认为可能是寻求帮助的时候了。

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

 程序集1:程序集2:程序集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 =真的)
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,)

所以基本上我正在创建非常基本树,并通过FK部分链接到更详细的数据。我需要能够查询任何程序集并查看它的后代 - 所以尽管我可以调用程序集3,但我无法调用多个树中的任何子进程。

对于我正在做的事情,从树中的任何一个特定的角度来说,下降将始终是一样的,即1.2将始终有1.2.1的孩子,但上升可以改变,即1.2可以有1和/或3的父母。

问题是Assembly.parent是一个ForeignKey,因为它限制为一个值。有什么想法可以解决一些问题吗?

如果您想查看其他代码或提问,请让我知道。这似乎是一个难题,试图明确解释!感谢


----编辑----

我知道我需要一个指示 - 循环图(DAG)模型。

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



----编辑2 ----



django-treebeard-dag

django-dag

我发现这两个很小的项目。我最初使用树莓版本,然后切换到django-dag为我的项目。对于有关基本用法的问题,请随时关注PM,我会看看是否可以帮助。

解决方案

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



树是一个广义的图表的形式。我知道没有Django应用程序可以帮助您处理这些。



您可能需要诉诸维护自己的ManyToMany关系,并放弃Django-mptt的方便。 / p>

I've been banging my head against the desk for a couple weeks on this problem, so I figure it may be time to seek some help.

I'm trying to implement a database structure which has hierarchical data of parts for assemblies. My main problem lies with trying to assign one "subassembly" to another "assembly"/tree. Refering to the example trees below- I have no problem creating and working with assembly 1 and 2. But when I make assembly 3, I get multiple objects returned errors when I call up the subassemblies (which I understand base on the way I'm attempting).

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               

Here is the model I've been trying:

#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,)

So basically I'm creating very basic trees and linking to the more detailed data through the Part FK. I need to be able to query any assembly and look at it's descendants- so although I can call assembly 3, I can't call any of the children that have been in multiple trees.

For what I'm doing, from any given point in the tree, going down will always be the same, i.e. 1.2 will always have a child of 1.2.1, but going up can change, i.e 1.2 can have parents of 1 and/or 3.

The problem is having the Assembly.parent be a ForeignKey as it limits it to one value. Any ideas on some solutions or things to try?

Please let me know if you want to see additional code or ask questions. This seems to be a difficult subject to try to clearly explain! Thanks

----EDIT----

I've figured out that I need a directed a-cyclic graph (DAG) model.

I don't have a specific solution yet, but when I figure it out or ask a DAG question, I'll try to post a link here.


----EDIT 2----

django-treebeard-dag

django-dag

I found these two very small projects. I was working with the "treebeard" version originally, then switched over to django-dag for my project. Feel free to PM with questions about basic usage, and I'll see if I can help.

解决方案

I think Django-mptt is the wrong tool for this particular job. It deals with trees, and part of being a tree in Data Structures is that nodes have one parent, or the node is the root of the tree.

Trees are a generalized form of Graphs. I know of no Django app that'll help you handle those.

You may have to resort to maintaining your own ManyToMany relationships and forgo the convenience of Django-mptt.

这篇关于Django-mptt和多个父母?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆