我正在努力将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
元素的元素(即。and
或or
),将被视为“如果所有条件评估”或“如果某些条件评估”。每个“条件组”又可以包含一个或多个条件类型元素。下面是一个更复杂的例子:
<trigger>
<and>
<condition />
<or>
<condition />
<condition />
<and>
<condition />
<condition />
</and>
</or>
</and>
<action>Do something</action>
</trigger>
我无法找出使用Django进行建模的最佳方法。理想情况下,我希望Trigger
模型链接到抽象ConditionType
模型(可以是Condition
或ConditionGroup
)和ConditionGroup
模型(但不是Condition
模型)链接到多个ConditionType
模型。
我是Django模型的新手。我已经阅读了有关模型继承的文档,但仍然无法弄清楚如何对这样复杂的东西进行建模。有没有人有任何想法?
答案 0 :(得分:0)
我强烈建议您忘记对XML建模,并专注于建模XML应该建模的任何内容。
至于你如何对此进行建模,没有人能够在不知道你想做什么的情况下告诉你。现在我们只有一系列名字。
您可以通过在abstract = True
类中设置Meta
来创建抽象模型。
关于将一个组链接到多个条件,最好的方法是在条件上有ForeignKey
,它们将它们链接到它们的包含组。这样,每个条件都不会超过一个组。
答案 1 :(得分:0)
所以,我最终通过以下三个类解决了这个问题:ConditionGroup
,SubConditionGroup
和Condition
。 SubConditionGroup
继承自ConditionGroup
。 ConditionGroup
可以是“单个”,“和”或“或”类型,其中“单个”包含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):
...