Ist django grok YML? django nicht geladen Befestigungen YML Datei (YML ist keine bekannte Serialisierung)

StackOverflow https://stackoverflow.com/questions/3880931

Frage

Ich habe mein erstes django Projekt erfolgreich erstellt.

Ich habe zwei Anwendungen in meinem Projekt foo und Foobar.

Ich habe einen Ordner erstellt in jedem der App Ordner mit dem Namen ‚Leuchten‘. Ich habe nicht ein Leuchten Verzeichnis in meinem settings.yml angegeben, so ( nach dem docs ), django in meinem {app} suchen sollte / Einrichtung Ordner.

In der {app} / Einrichtung Ordner habe ich mehrere YML Dateien. Ich habe die Ausgangsdaten für die verschiedenen Module in separate YML Dateien aufgeteilt, um sicherzustellen, gibt es keine Querdateiabhängigkeiten (dh alle verwandten Modelle in der gleichen YML Datei sind und Vorfahren treten in der Datei vor den Modellen, die sie verwenden).

Allerdings, wenn ich syncdb run./manage.py nachdem die db Objekte erfolgreich erstellt wurden, gibt es die folgende Meldung an:

Seite nicht gefunden Plan

Ich habe dann versucht, manuell die Geräte laden, indem Sie den Loaddata Befehl:

./manage.py loaddata 0100_foobar.yml
Problem installing fixture '0100_foobar': yml is not a known serialization 

Ist die Dokumentation in dem obigen Link falsch gegeben ?, oder brauche ich ein Modul, um für django zu installieren YML grok?

BTW, die YML Dateien analysieren richtig und haben für ihre Richtigkeit überprüft worden (i verwendet, um sie erfolgreich in einem anderen Projekt) - so dass nicht das Problem

[Bearbeiten]

Ich habe PyYaml installiert und umbenannt meine Armaturen Dateien per Manoj Anweisungen. Ich bin in der Lage ein wenig weiter auf der ganzen Linie zu bekommen, aber ich bin immer noch Probleme auftreten (BTW, ich bin mit PyYaml 3.0.9).

Hier ist das Modell in meinem Projekt ORM (d {app} /model.py):

class Currency(models.Model):
    short_name = models.CharField(max_length=3, db_index=True, unique=True, null=False) # ISO Code
    long_name = models.CharField(max_length=64, db_index=True, unique=True, null=False)
    spot_settle = models.IntegerField(null=False, default=0)
    rounding = models.IntegerField(null=False, default=2)

Hier ist die YAML-Datei Ich bin importieren:

Currency:    
  currency_aud : { short_name: AUD , long_name: Australia - Dollars , spot_settle: 0, rounding: 2 }    
  currency_cad : { short_name: CAD , long_name: Canada - Dollars , spot_settle: 0, rounding: 2 }    
  currency_eur : { short_name: EUR , long_name: Euro Member Countries - Euro , spot_settle: 0, rounding: 2 }    
  currency_gbp : { short_name: GBP , long_name: United Kingdom - Pounds , spot_settle: 0, rounding: 2 }    
  currency_jpy : { short_name: JPY , long_name: Japan - Yen , spot_settle: 0, rounding: 2 }    
  currency_usd : { short_name: USD , long_name: United States Of America - Dollars , spot_settle: 0, rounding: 2 }    
  currency_zar : { short_name: ZAR , long_name: South Africa - Rand, spot_settle: 0, rounding: 2 }    
  currency_hkd : { short_name: HKD , long_name: Hong Kong Dollar, spot_settle: 0, rounding: 2 }    
  currency_nzd : { short_name: NZD , long_name: New Zealand Dollar, spot_settle: 0, rounding: 2 }    
  currency_sgd : { short_name: SGD , long_name: Singapore Dollar, spot_settle: 0, rounding: 2 }    
  currency_dkk : { short_name: DKK , long_name: Danish Krone, spot_settle: 0, rounding: 2 }    
  currency_sek : { short_name: SEK , long_name: Swedish Krona, spot_settle: 0, rounding: 2 }    
  currency_chf : { short_name: CHF , long_name: Swiss Franc, spot_settle: 0, rounding: 2 }

Hier ist der Stack-Trace, wenn ich laufen ./manage.py Loaddata myapp / Einrichtung / currencies.yaml

me@somebox:~/work/demo/myproj$ ./manage.py loaddata reference/fixtures/0100_currency.yaml 
Installing yaml fixture 'reference/fixtures/0100_currency' from absolute path.
Problem installing fixture 'reference/fixtures/0100_currency.yaml': Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/loaddata.py", line 165, in handle
    for obj in objects:
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/pyyaml.py", line 57, in Deserializer
    for obj in PythonDeserializer(yaml.load(stream), **options):
  File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/python.py", line 84, in Deserializer
    Model = _get_model(d["model"])
TypeError: string indices must be integers, not str
War es hilfreich?

Lösung

Ich habe versucht, das Problem in einem meiner Projekte zu reproduzieren. Offenbar loaddata erwartet, dass die Erweiterung der Datei, die die Serialisierung Format anzupassen. In Ihrem Fall sollten Sie Ihre Datei 0100_foobar.yaml (beachten Sie die neue Erweiterung) umbenennen.

Lokale Tests zeigten, meine Hypothese richtig war.

PS : YAML Serialisierung erfordert die PyYAML Bibliothek. Wenn Sie nicht bereits haben, installieren Sie PyYAML .

Aktualisieren

Ich kopierte das Modell der OP zu einem meiner Projekte. Als ich versuchte, die Probe YAML vom OP gegeben zu laden, wie sie ist, ich habe das gleiche Fehler.

Danach habe ich einige Daten hinzugefügt, um den Admin-App und gebrauchten django.core.serializers.serialize unter Verwendung der Daten in YAML-Format auszugeben.

from django.core.serializers import serialize
from app.models import Currency
print serializers.serialize("yaml", Currency.objects.all())

Das Ergebnis habe ich sieht deutlich anders aus, was die OP gebucht. Siehe unten. Ich habe drei Instanzen für das Modell und sie zeigen sich.

- fields: {long_name: Australia - Dollars, rounding: 2, short_name: AUD, spot_settle: 0}
  model: app.currency
  pk: 1
- fields: {long_name: Canada - Dollars, rounding: 2, short_name: CAD, spot_settle: 0}
  model: app.currency
  pk: 2
- fields: {long_name: Euro Member Countries - Euro, rounding: 2, short_name: EUR,
    spot_settle: 0}
  model: app.currency
  pk: 3

Ich konnte ohne Probleme, diese Daten wieder laden.

In Anbetracht der oben vermute ich, dass es etwas falsch mit der YAML-Datei des OP ist. @skyeagle, können Sie versuchen Dumping die vorhandenen Daten und und versuchen, den Dump zurück Laden?

Andere Tipps

Für jemanden wie mich, der nur stur ist und wirklich, wirklich will Dateien verwenden, um mit einer .yml Erweiterung können Sie einen Serializer beim Start registrieren, um loaddata erkennen die Befestigungsdatei zu machen:

from django.apps import AppConfig
from django.core.serializers import register_serializer


class MyAppConfig(AppConfig):
    name = 'my_app_name'
    label = 'my_app_label'
    verbose_name = 'this is my really cool app'

    def ready(self):
        register_serializer('yml', 'django.core.serializers.pyyaml')

Der Aufruf von register_serializer yml als anerkannte Erweiterung registriert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top