0

Django で有向グラフを作成したいのですが、各ノードは個別のフィールドなどを持つ個別のモデルになる可能性があります。

ここに私がこれまでに持っているものがあります:

from bannergraph.apps.banners.models import *

class Node(models.Model):
    uuid = UUIDField(db_index=True, auto=True)

    class Meta:
        abstract = True

class FirstNode(Node):
    field_name = models.CharField(max_length=100)

    next_node = UUIDField()

class SecondNode(Node):
    is_something = models.BooleanField(default=False)

    first_choice = UUIDField()
    second_choice = UUIDField()

(明らかにFirstNodeSecondNodeは、よりドメイン固有のモデルのプレースホルダーですが、要点を理解していただければ幸いです。)

そこで、すべてのサブクラスを一度に照会して、一致するすべてのサブクラスを返したいと考えています。これを効率的に行う方法がよくわかりません。

私が試したこと:

  1. クエリを使用してサブクラスを反復処理する - クエリの数が非常に重くなる可能性があるため、これは好きではありません。
  2. Nodeコンクリート作り。どうやら、#1 に戻る各サブクラスをチェックする必要があるようです。

私が検討したこと:

  • クラスを作成Nodeし、JSON blob を貼り付けます。私はこれが好きではありません。
  • 外部テーブルまたはシステムへのポインターの格納。これは、UUID ごとに 2 つのクエリを意味します。理想的には 1 つが必要ですが、ピンチではおそらく問題なく実行できます。

では、私はこれにアプローチするのが間違っているのでしょうか、それとも Django の優れた機能を忘れているのでしょうか? 必要がなければ、スキーマレス DB を使用したくありません (このプロジェクトでは、Django 管理者はほとんど不可欠です)。何か案は?

4

1 に答える 1

1

InheritanceManagerdjango-model-utilsあなたが探しているものです。

以下を使用して、すべてのノードを反復処理できます。

nodes = Node.objects.filter(foo="bar").select_subclasses()
    for node in nodes:
        #logic
于 2013-09-10T06:18:11.627 に答える