Fa Django Grok YML? django non caricando il file infissi YML (yml non è una serializzazione noto)

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

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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top