gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:07:52 27 4
gpt4 key购买 nike

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

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

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 方式解决这个问题。

编辑:我应该补充一点,我正在使用 Python 3.3 和 Django dev(将命名为 1.6)

最佳答案

我终于通过 IRC here 上的一些重要帮助找到了答案,并想分享它以防其他人遇到同样的问题。

我最终必须改变的唯一一件事是 Flow.getChildren()。

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

如果有人有更简洁的解决方案,我很乐意看到它,尤其是因为这似乎需要做很多工作,而框架似乎应该更直接地处理。

关于django - 使用多态节点类型在 Django 中建模分层数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com