12

私はこの問題について数週間机に頭をぶつけてきたので、助けを求める時が来たのではないかと思います。

アセンブリのパーツの階層データを持つデータベース構造を実装しようとしています。私の主な問題は、ある「サブアセンブリ」を別の「アセンブリ」/ツリーに割り当てようとすることです。以下のツリーの例を参照してください-アセンブリ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,)

つまり、基本的に私は非常に基本的なツリーを作成し、パートFKを介してより詳細なデータにリンクしています。アセンブリをクエリしてその子孫を確認できる必要があります。そのため、アセンブリ3を呼び出すことはできますが、複数のツリーに存在する子を呼び出すことはできません。

私が行っていることでは、ツリーの任意のポイントから、下がるのは常に同じです。つまり、1.2は常に1.2.1の子を持ちますが、上がるは変わる可能性があります。つまり、1.2は1の親を持つことができます。または3。

問題は、Assembly.parentを1つの値に制限するため、ForeignKeyにすることです。いくつかの解決策や試すべきことについて何かアイデアはありますか?

追加のコードを確認したり、質問したりする場合は、お知らせください。これは明確に説明しようとするのが難しい主題のようです!ありがとう

- - 編集 - -

有向非巡回グラフ(DAG)モデルが必要であることがわかりました。

具体的な解決策はまだありませんが、それを理解したり、DAGに質問したりするときは、ここにリンクを投稿しようと思います。


----編集2----

django-treebeard-dag

django-dag

私はこれらの2つの非常に小さなプロジェクトを見つけました。私はもともと「木の髭」バージョンで作業していましたが、プロジェクトのためにdjango-dagに切り替えました。基本的な使用法について質問がある場合は、PMまでお気軽にご連絡ください。サポートできるかどうかを確認します。

4

1 に答える 1

13

Django-mpttは、この特定の仕事には間違ったツールだと思います。これはツリーを扱い、データ構造のツリーであることの一部は、ノードに1つの親があるか、ノードがツリーのルートであるということです。

ツリーは、グラフの一般化された形式です。それらを処理するのに役立つDjangoアプリはありません。

独自のManyToMany関係を維持し、Django-mpttの利便性を放棄する必要があるかもしれません。

于 2011-04-26T20:19:21.763 に答える