在Django中创建一个多模型

时间:2013-09-10 03:24:58

标签: python django

我想在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。
  3. 我考虑过的事情:

    • 制作Node类,并在其中粘贴JSON blob。我不喜欢这个。
    • 在外部表或系统中存储指针。这意味着每个UUID有2个查询,理想情况下我想拥有1个查询,但它可能会在紧要关头做好。

    那么,我是在接近这个错误,还是忘记了Django的一些简洁功能?如果我不需要,我宁愿不使用无模式数据库(Django管理员对于这个项目几乎是必不可少的)。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

django-model-utils中的InheritanceManager正是您要找的。

您可以使用以下代码遍历所有节点

nodes = Node.objects.filter(foo="bar").select_subclasses()
    for node in nodes:
        #logic