在Django中建模嵌套的XML元素

时间:2012-01-25 12:32:27

标签: xml django data-modeling

我正在努力将XML数据导入Django模型。例如,我可以使用以下XML:

<family surname="Jones">
    <person name="Bob" />
</family>

填充以下Django模型:

class Family(models.Model):
    surname = models.CharField(max_length=255)

class Person(models.Model):
    family = models.ForeignKey(Family, related_name="people")
    name = models.CharField(max_length=255)

在XML中,存在“触发器”与“条件”的概念。例如:

<trigger>
    <condition ... />
    <action>Do something</action>
</trigger>

触发器可能有一个condition-type元素,其中'condition-type'表示condition元素或包含一组condition元素的元素(即。andor),将被视为“如果所有条件评估”或“如果某些条件评估”。每个“条件组”又可以包含一个或多个条件类型元素。下面是一个更复杂的例子:

<trigger>
    <and>
        <condition />
        <or>
            <condition />
            <condition />
            <and>
                <condition />
                <condition />
            </and>
        </or>
    </and>
    <action>Do something</action>
</trigger>

我无法找出使用Django进行建模的最佳方法。理想情况下,我希望Trigger模型链接到抽象ConditionType模型(可以是ConditionConditionGroup)和ConditionGroup模型(但不是Condition模型)链接到多个ConditionType模型。

我是Django模型的新手。我已经阅读了有关模型继承的文档,但仍然无法弄清楚如何对这样复杂的东西进行建模。有没有人有任何想法?

2 个答案:

答案 0 :(得分:0)

我强烈建议您忘记对XML建模,并专注于建模XML应该建模的任何内容。

至于你如何对此进行建模,没有人能够在不知道你想做什么的情况下告诉你。现在我们只有一系列名字。

您可以通过在abstract = True类中设置Meta来创建抽象模型。

关于将一个组链接到多个条件,最好的方法是在条件上有ForeignKey,它们将它们链接到它们的包含组。这样,每个条件都不会超过一个组。

答案 1 :(得分:0)

所以,我最终通过以下三个类解决了这个问题:ConditionGroupSubConditionGroupConditionSubConditionGroup继承自ConditionGroupConditionGroup可以是“单个”,“和”或“或”类型,其中“单个”包含Condition,其他两个可以包含多个SubConditionGroup

所以,我完成的模型看起来像这样:

class Trigger(Model):
    ...
    condition_group = ForeignKey(...)


class ConditionGroup(Model):
    type = CharField(...)  # options="and"|"or"|"single"
    condition = OneToOneField(..., null=True, blank=True)


class SubConditionGroup(ConditionGroup):
    parent = ForeignKey(ConditionGroup, ...)


class Condition(Model):
    ...