2016-05-26 30 views
1

私はデータモデリング(私はpythonとmongoengineを使用しています)について考えて助けが必要です。私はオブジェクトが持っている別の属性に応じて、さまざまな種類の埋め込みドキュメントを適用したいオブジェクトを持っています。mongodbオブジェクトのための条件付き埋め込みドキュメント

class RunningSettings(EmbeddedDocument): 
    max_distance = DecimalField() 
    speed = DecimalField() 
    ... 

class WeightLiftingSettings(EmbeddedDocument): 
    max_weight = DecimalField() 
    reps = IntField() 
    ... 


class Workout(Document): 
    name = StringField() 
    description = StringField() 
    date_created = DateTimeField(default=datetime.utcnow()) 
    kind = StringField() 

    # pseudo starts 
    <if self.kind == "running"> 
    settings = EmbeddedDocumentField('RunningSettings') 

    <if self.kind == "weight_lifting"> 
    settings = EmbeddedDocumentField('WeightLiftingSettings') 

私の問題は、私は、オブジェクトを.save()たびに、私はこれが働くことができるかわからないということです。多分それはあまりにも奇妙であるか、または複雑で始まるでしょうか?私は提案に開放されています。

答えて

0

これは、継承を使用するための良い候補のように聞こえる:

class RunningSettings(EmbeddedDocument): 
    max_distance = DecimalField() 
    speed = DecimalField() 

class Workout(Document): 
    name = StringField() 
    description = StringField() 
    date_created = DateTimeField(default=datetime.utcnow()) 
    meta = {'allow_inheritance': True} 

class RunningWorkout(Document): 
    settings = EmbeddedDocumentField(RunningSettings) 

別のオプションは、ワークアウトのコンストラクタをオーバーライドして、そこに設定をインスタンス化することですが、それはあまりエレガントです。

関連する問題