Fa Django Grok YML? django non caricando il file infissi YML (yml non è una serializzazione noto)
-
28-09-2019 - |
Domanda
ho creato con successo il mio primo progetto Django.
Ho due applicazioni nel mio progetto foo e foobar.
ho creato una cartella denominata '' infissi in ciascuna delle cartelle app. Non ho specificato una directory infissi nel mio settings.yml, in modo ( secondo il docs ), Django dovrebbe essere alla ricerca nel mio {app} / cartella infissi.
Nel {app} / cartella infissi, ho diversi file YML. Ho suddividere i dati iniziali per i vari moduli in file YML separati, assicurandosi che non vi siano dipendenze fra i file trasversali (cioè tutti i modelli relativi sono nello stesso file YML e antenati si verificano nel file prima di modelli che ne fanno uso).
Tuttavia, quando ho run./manage.py syncdb dopo che gli oggetti db sono stati creati con successo, ci fu il seguente messaggio:
Nessun dispositivo trovato
Ho poi provato a caricare manualmente i proiettori utilizzando il comando loaddata:
./manage.py loaddata 0100_foobar.yml
Problem installing fixture '0100_foobar': yml is not a known serialization
E 'la documentazione data nel link qui sopra sbagliato ?, o ho bisogno di installare un modulo al fine di Django di Grok YML?
A proposito, i file YML analizza correttamente e sono stati controllati per correttezza (io ho usato con successo in un altro progetto) - in modo che non è il problema
[Edit]
Ho installato PyYaml e rinominato i file infissi secondo le istruzioni del Manoj. Sono in grado di ottenere un po 'più in basso la linea, ma sto ancora incontrando problemi (BTW, sto usando PyYaml 3.0.9).
Ecco il modello nel mio progetto ORM (vale a dire {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)
Questo è il file YAML Sto importando:
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 }
Questa è la traccia dello stack quando corro ./manage.py loaddata frontend / fixtures / 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
Soluzione
Ho cercato di riprodurre il problema in uno dei miei progetti. A quanto pare loaddata
si aspetta che il estensione del file in base al formato di serializzazione. Nel tuo caso si dovrebbe rinominare il file a 0100_foobar.yaml
(notare la nuova estensione).
Prove locali ha mostrato la mia ipotesi era corretta.
PS : YAML serializzazione richiede la libreria PyYAML
. Se hai già contrario, installare PyYAML .
Aggiorna
Ho copiato il modello del PO a uno dei miei progetti. Quando ho provato a caricare il campione YAML in OP così com'è, ho ricevuto il stesso errore.
Dopo che ho aggiunto alcuni dati utilizzando l'applicazione di amministrazione e django.core.serializers.serialize
utilizzato per scaricare i dati in formato YAML.
from django.core.serializers import serialize
from app.models import Currency
print serializers.serialize("yaml", Currency.objects.all())
Il risultato mi sono guardato significativamente diverso da quello che l'OP postato. Vedi sotto. Ho aggiunto tre istanze per il modello e si stanno rivelando.
- 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
Sono stato in grado di caricare questo ritorno di dati senza alcuna difficoltà.
Dato quanto sopra, ho il sospetto che ci sia qualcosa di sbagliato con file YAML del PO. @skyeagle, si può provare a il dumping i dati esistenti e poi provare a caricare il posteriore discarica?
Altri suggerimenti
Per tutti coloro che come me è solo testardo e davvero, davvero, vuole utilizzare i file con estensione .yml
, è possibile registrare un serializzatore in fase di avvio per rendere loaddata
riconosce il file fixture:
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')
La chiamata alla register_serializer
registrerà yml
come un'estensione riconosciuta.