首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用多态节点类型在django中建模分层数据

使用多态节点类型在django中建模分层数据
EN

Stack Overflow用户
提问于 2013-06-23 13:12:01
回答 2查看 262关注 0票数 3

我有两个基本模型,一个命令和一个流。流可以包含一系列命令或其他嵌套流。因此,任何给定的流都可以有一个子级列表,这些子级可以是步骤类型,也可以是流类型。(这类似于您可能在文件系统中建模的文件和目录。)

我曾尝试使用ContentTypes、泛型关系和mptt (不允许泛型内容类型AFAIK)对此进行建模,但都没有成功。以下是我的基本模型:

代码语言:javascript
运行
复制
class Step(models.Model):
    parent     = models.ForeignKey('Step', null=True)
    name        = models.CharField( max_length=100 )
    start_time  = models.DateTimeField(null=True)
    end_time    = models.DateTimeField(null=True)
    state       = models.CharField( max_length=1, default='u' )

class Flow(Step):
    type  = models.CharField( max_length=1 )

    def getChildren(self):
        # todo: the steps returned here need to be sorted by their order in the flow
        return Step.objects.filter(parent_id=self.parent_id)

    def run(self):
      for child in self.getChildren():
          print("DEBUG: run method processing a {0}".format(child.__class__.__name__) )
          # if this is a flow, run it
          # else if it's a command, execute it

class Command(Step):
    exec_string = models.TextField()

我希望能够在我的应用程序中创建流,查询子进程,然后根据其类型对每个子进程进行不同的处理(执行命令,递归处理流)。

我非常感谢对上面代码的任何修改,这将使这成为可能,或者甚至评论说,对于Django来说,我处理这个问题的方式是完全错误的。

编辑:我应该补充说我使用的是Python3.3和Django dev (将命名为1.6)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-26 01:59:04

我终于在这里的IRC上找到了答案,并想分享它,以防其他人也有同样的问题。

我最终要修改的唯一一件事是Flow.getChildren()。

代码语言:javascript
运行
复制
def getChildren(self):
    # Get a list of all the attrs relating to Child models.
    child_attrs = dict(
        (rel.var_name, rel.get_cache_name())
        for rel in Step._meta.get_all_related_objects()
        if issubclass(rel.field.model, Step) and isinstance(rel.field, models.OneToOneField)
    )

    objs = []
    for obj in self.children.all().select_related(*child_attrs.keys()):
        # Try to find any children...
        for child in child_attrs.values():
            sobj = obj.__dict__.get(child)
            if sobj is not None:
                break
        objs.append(sobj)
    return objs

如果有人有一个更干净的解决方案,我很乐意看到它,特别是因为这似乎是很多工作,似乎框架应该更直接地处理一些事情。

票数 3
EN

Stack Overflow用户

发布于 2013-06-25 03:15:33

我想到的是"return Step.objects.filter(parent_id=self.parent_id)".“我认为应该是"return Step.objects.filter(parent__pk=self.parent.pk)“”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17257892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档