2010-12-09 9 views
5

Das Djangoprojekt, an dem ich gerade arbeite, hat eine Menge initial_data Fixture Daten. Es scheint standardmäßig die einzige Möglichkeit, Daten automatisch laden zu lassen, eine Datei in Ihrem App-Ordner fixtures zu haben, und die Datei muss den Namen initial_data.ext haben (ext ist xml oder json oder yaml oder so).initial_data Fixture Management in Django

Das ist wirklich unflexibel, denke ich. Ich hätte lieber einen Fixtures-Ordner und dann einen Initial Data-Ordner und dann eine Datei für jedes Modell in dieser App. Oder etwas in diesem Sinne. Kann man das jetzt im Django machen? Oder vielleicht ein anderes Schema einer besseren Vorrichtungsorganisation.

Antwort

0

Ja, Sie können Fixtures in mehrere Dateien mit Unterordnerstrukturen aufteilen. Sie können Vorrichtungsdateien angeben, um ein Skript zu laden und zu erstellen, das einige oder alle lädt. Ich habe das schon einmal gemacht und kann bestätigen, dass es funktioniert.

Beispiel: django-admin.py loaddata application/module/model.json

Siehe loaddata Dokumentation für weitere Informationen.

+0

yeah aber diese Vorrichtungen werden nicht automatisch auf eine syncdb geladen ... – priestc

+0

nbv4: Ich fand, dass die bequemste Methode für die Behandlung dieses Problems während der Entwicklung ist, ein Datenbankresetscript zu schaffen, das zuerst die Datenbank löscht (Datenbank abhängig), erstellen Sie dann Datenbankstrukturen (syncdb) und laden Sie Fixtures (loaddata). – vls

9

Meiner Erfahrung nach sind hart codierte Fixtures schmerzhaft zu schreiben und mühsam zu warten. Wo auch immer ein Modellwechsel ein Fixture unterbricht, die Django Initial Load wird eine sehr unfreundliche Fehlermeldung zurückgeben und Sie werden schließlich einen Haufen a von Prints im Django Core hinzufügen, um herauszufinden wo das Problem herkommt.

Einer der Entwickler, mit denen ich arbeite, hat eine sehr gute Bibliothek entwickelt, um dieses Problem zu überwinden, es heißt django-dynamic-fixture und wir lieben es wirklich. Hier ist, wie es funktioniert:

Angenommen, Sie haben diese Modelle:

class Author(models.Model): 
    name = models.CharField() 

class Book(models.Model): 
    author = models.ForeingKey(Author, required=True) 
    title = models.CharField() 

Um ein Buch Instanz in Ihrem Test zu erstellen, alles, was Sie tun müssen, ist

from django_dynamic_fixture import get 
from app import Book 

class MyTest(TestCase): 
    def setUp(self): 
     self.book = get(Book) 

Die django- dynamic-fixture erstellt automatisch alle Abhängigkeiten, die für das Vorhandensein des Buchmodells erforderlich sind. Dies ist nur ein einfaches Beispiel, aber die Bibliothek kann sehr komplexe Modellstrukturen verarbeiten.

+0

Wie gehst du vor, wenn du Setup und Teardown machst, speziell während du mit djano-nose arbeitest? – whatf

+0

@whatf Ich bin mir nicht sicher, was Sie gefragt haben. Das Beispiel, das ich gab, hat bereits ein Setup-Beispiel. Die Verwendung von django-nose würde das –

+0

innerhalb einer Klasse nicht ändern, vor und nach dem Ausführen jeder der Testdefinitionen werden die Methoden setUp und tearDown aufgerufen. Dadurch werden die Tests langsam. django_nose, optimiert es jedoch. Bitte beachten Sie das Dokument. Ich war nur neugierig, wie Sie diese Optimierungen mit DDF kümmern würden. – whatf

0

A hacky Weise eine zusätzliche initial_data.json oder zwei zu laden ist zusätzliche leere Anwendungen in Ihrem Django-Projekt zu erstellen, das nichts hat, aber die Armaturen Ordner und die Datei initial_data.json. Wenn das Fixture vor den Fixtures der anderen Apps geladen werden muss, könnte man etwas wie aa1 nennen. Wenn Sie einen anderen benötigen, können Sie ihn aa2 nennen. Verzeichnisstruktur würde wie folgt aussehen:

aa1/ 
    fixtures/ 
     initial_data.json 

aa2/ 
    fixtures/ 
     initial_data.json 

myrealapp/ 
    fixtures/ 
     initial_data.json 
... 

Sie müßten die Apps INSTALLED_APPS in settings.py hinzuzufügen.

Sie können dann die fixture_data auffüllen.json Dateien mit beliebigen App Informationen wie nötig:

(virtualenv) ./manage.py dumpdata --indent=4 auth > aa1/fixtures/initial_data.json 

(virtualenv) ./manage.py dumpdata --indent=4 oauth2 > aa2/fixtures/initial_data.json 

(virtualenv) ./manage.py dumpdata --indent=4 myrealapp > myrealapp/fixtures/initial_data.json 

Wenn Sie python manage.py syncdb laufen, jedes der Geräte werden automatisch in alphabetischer Reihenfolge geladen werden.

Wie ich bereits erwähnt habe, ist dies ziemlich hacky, aber wenn Sie nur ein paar extra initial_data.json Dateien benötigen und in der Lage sein müssen, die Reihenfolge zu steuern, in der sie geladen werden, funktioniert das.