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 的一些简洁功能?如果不需要,我宁愿不使用无模式数据库(Django 管理员对于这个项目几乎是必不可少的)。有任何想法吗?

4

1 回答 1

1

InheritanceManager fromdjango-model-utils是您正在寻找的。

您可以使用以下方法遍历所有节点:

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