2012-01-25 11 views
0

XMLデータをDjangoモデルにインポートする作業を進めています。以下のDjangoのモデルを投入するためにDjangoでネストされたXML要素をモデリングする

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

:たとえば、私は、次のXMLを使用することができ

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では、「条件」と「トリガー」の概念があります。トリガーが「条件タイプが」condition要素またはあるcondition要素(すなわちand又はor)の基を含有元素のいずれかを意味する一つの条件型要素を有していてもよい

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

:例えば「すべての条件が評価された場合」または「条件の一部が評価された場合」として読み取られます。各「条件グループ」は、1つ以上の条件タイプ要素を含むことができる。もっと複雑な例を次に示します:

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

私はDjangoでこれをモデル化する最良の方法を理解できません。理想的には私は、複数のConditionTypeのモデルにリンクする(ConditionまたはConditionGroupのいずれかになります)抽象ConditionTypeモデルにリンクするTriggerモデル、およびConditionGroupモデル(ただしConditionモデル)をしたいと思います。

私はDjangoモデルを新しく使っています。私はモデルの継承に関するドキュメンテーションを読みましたが、これほど複雑なモデルをどのようにモデル化するのかまだ分かりません。誰にもアイデアはありますか?

答えて

0

したがって、私は最終的に次の3つのクラスを持つことで問題を解決しました:ConditionGroup,SubConditionGroupおよびConditionSubConditionGroupConditionGroupを継承しています。 ConditionGroupは 'single'、 'and' or 'or'のいずれかであり、 'single'にはConditionが含まれ、他の2つには複数の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): 
    ... 
0

XMLのモデリングを忘れることを強くお勧めします。また、XMLがモデル化するものをモデリングすることに集中することを強くお勧めします。

これをどのようにモデル化するかについては、あなたが何をしたいのかわからなくても誰もあなたに話すことができません。今私たちはあなたからの一連の名前を持っています。

Metaクラスにabstract = Trueを設定することで、抽象モデルを作成できます。

グループを複数の条件にリンクするには、条件にForeignKeyを含めることが最善の方法です。これはグループをグループにリンクします。このようにして、各条件は1つ以上のグループに属しません。

+0

'trigger'、' condition'を、 'action' XMLは、すなわち、イベントの論理チェーンをモデル化することになっています。 '条件が成立すれば、 'action'を実行する必要があります。これをモデル化する別の方法を提案できる場合は、先に進んでください。 –

+0

私は 'Trigger'と' ConditionGroup'の両方が継承し、 'Condition'と' ConditionGroup'の両方のリンクを持って 'ForeignKey'を使って' ConditionContainer'に戻る抽象モデル 'ConditionContainer'を考えています。フィールド。 残念ながら、 'ForeignKey'を抽象モデルにリンクすることはできないので、これは不可能です。 –

+0

@JoelCross:具体的なクラスとしてConditionContainerを使用できます。 – Marcin

関連する問題