2016-05-26 14 views
1

Ich brauche Hilfe beim Nachdenken über Datenmodellierung (ich benutze Python und Mongoengine). Ich habe ein Objekt, auf das ich verschiedene Klassen von eingebetteten Dokumenten anwenden möchte, abhängig von einem anderen Attribut, das das Objekt hat.Bedingtes eingebettetes Dokument für mongodb Objekte

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') 

Mein Problem ist, dass jedes Mal, wenn ich das Objekt .save(), ich bin nicht sicher, wie das funktionieren kann. Vielleicht ist es zu seltsam oder zu kompliziert, um damit anzufangen? Ich bin offen für Vorschläge.

Antwort

0

Das klingt wie ein guter Kandidat für die Vererbung:

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) 

Eine weitere Option ist der Konstruktor von Workout außer Kraft zu setzen und die Einstellungen dort instanziiert, aber es ist weniger elegant.

Verwandte Themen