Моделирование вложенных элементов XML в Django - PullRequest
0 голосов
/ 25 января 2012

Я работаю над импортом данных 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, либо элемент, содержащий группу элементов condition (т. Е. and или or), которые должны читаться как «если все условия оценивают» или «если некоторые из условий оценивают». Каждая «группа условий» может, в свою очередь, содержать один или несколько элементов типа условия. Ниже приведен более сложный пример:

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

Я не могу придумать лучший способ смоделировать это с Джанго. В идеале я хотел бы, чтобы модель Trigger ссылалась на абстрактную модель ConditionType (которая может быть Condition или ConditionGroup) и модель ConditionGroup (но не модель Condition) для ссылки на несколько ConditionType моделей.

Я довольно новичок в моделях Django. Я прочитал документацию, касающуюся наследования моделей, но все еще не могу понять, как моделировать что-то настолько сложное, как это. У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012

Итак, я в итоге решил проблему, имея следующие три класса: ConditionGroup, SubConditionGroup и Condition.SubConditionGroup наследуется от ConditionGroup.ConditionGroup s может иметь тип 'single', 'и' или 'or', где 'single' содержит Condition, а два других могут содержать несколько SubConditionGroup s.

Итак, мойГотовая модель выглядит примерно так:

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):
    ...
0 голосов
/ 25 января 2012

Я настоятельно рекомендую вам забыть о моделировании XML и сосредоточиться на моделировании того, что предполагается моделировать XML.

Что касается того, как вы смоделируете это, то мало кто может сказать вам, не зная, что вы хотите сделать; сейчас у нас есть немного больше, чем последовательность имен от вас.

Вы можете создавать абстрактные модели, задав abstract = True в классе Meta.

Что касается связывания группы с несколькими Условиями, лучший способ - это иметь ForeignKey в Условиях, который связывает их с их группой, в которой они содержатся. Таким образом, каждое условие будет принадлежать не более чем одной группе.

...