2016-09-10 2 views
1

ich ./manage.py dumpdata --natural-foreign --natural-primary meine Klassen versuche, die da sind:Django DumpData von Multi-Table vererbte Objekte

class SuperClassManager(Manager): 
    def get_by_natural_key(self, identifier): 
     return self.get(identifier=identifier) 

class SuperClass(Model): 
    objects = SuperClassManager() 

    identifier = CharField(max_length=31, unique=True) 

    def natural_key(self): 
     return (self.identifier,) 

class Class(SuperClass): 
    pass 

Aber die gesicherten Daten ist:

[ 
{ 
    "model": "app.superclass", 
    "fields": { 
     "identifier": "identifier" 
    } 
}, 
{ 
    "model": "app.class", 
    "fields": {} 
} 
] 

Es gibt keine Möglichkeit, die Class Instanz zu beziehen zur SuperClass Instanz in diesem Fall. Was vermisse ich? Warum ist das superclass_ptr in Class (das auf SuperClass zeigt) nicht serialisiert, so dass es möglich ist, die Instanzen zu beziehen?

Problem ist: Ich habe mehr als eine Unterklasse zu meiner Oberklasse und viele Instanzen jeder Unterklasse. Also brauche ich diese Beziehung, damit meine Fixtures Sinn ergeben.

Antwort

0

Sie müssen die Daten aus Ihrer Oberklasse und allen Unterklassen, die Sie haben möchten, ausgeben und, um alles zurück zu laden, zuerst die Oberklasse und dann die Unterklassen laden.

Django macht die Vererbung automatisch für Sie verlinken, so dass Sie sich nicht darum kümmern müssen (Sie werden sehen, dass sowohl die Oberklasse als auch die Unterklassen dieselbe pk teilen).

Hier ist ein Beispiel:

# To export the data 
$ python manage.py dumpdata app.Superclass > superclass.json 
$ python manage.py dumpdata app.SubclassA app.SubclassB > subclasses.json 


# To import the data 
$ python manage.py loaddata superclass.json 
$ python manage.py loaddata subclasses.json 
+0

Wenn Sie natürliche Primärschlüssel verwenden, gibt Django keine Primärschlüssel aus. Außerdem ist dies ein Fehler und ich habe einen Patch, um ihn in einer Pull-Anfrage in Djangos GitHub zu reparieren. – jpmelos

+0

Interessant, ich hatte in letzter Zeit ähnliche Zweifel über dieses Thema und dachte, dass dies helfen würde, aber es scheint, dass Ihr Problem ein wenig komplexer ist. Froh, dass Sie einen Workaround dafür gefunden haben. – ihhcarus

+0

Ja, aber danke, dass du versucht hast, trotzdem zu helfen! – jpmelos