2014-09-13 9 views
8

Prima di Django 1.7 che ho usato per definire una fixtures directory per-progetto nelle impostazioni:Come creare per ogni singolo progetto initial_data infissi in Django 1.7+

FIXTURE_DIRS = ('myproject/fixtures',) 

e l'uso che per mettere la mia initial_data.json apparecchio memorizzare il default gruppi essenziali per l'intero progetto. Questo ha funzionato bene per me, poiché ho potuto mantenere pulito il progetto separando i dati per progetto dai dati specifici delle app.

Ora con gli apparecchi Django 1.7, initial_data sono stati ritirati, suggesting per includere data migrations insieme alle migrazioni di schema dell'app; non lasciando una scelta ovvia per i dati iniziali globali per progetto.

Inoltre il nuovo migrations framework installa tutti i precedenti apparecchi di dati iniziali prima migrazioni esecuzione per le applicazioni compatibili (compresa la django.contrib.auth app). Questo comportamento fa sì che il mio dispositivo contenente i gruppi predefiniti su fallisca l'installazione, poiché la tabella auth_group non è ancora presente nel DB.

Qualche suggerimento su come (elegantemente) far funzionare gli apparecchi dopo tutte le migrazioni, o almeno dopo le migrazioni delle app di autenticazione? O altre idee per risolvere questo problema? Trovo gli apparecchi un ottimo modo per fornire dati iniziali e vorrei avere un modo semplice e pulito per dichiararli per l'installazione automatica. Il nuovo RunPython è troppo macchinoso e lo considero un eccessivo per la maggior parte degli scopi; e sembra essere disponibile solo per le migrazioni per app.

+0

Dato che è deprecato, probabilmente sarà un po 'imbarazzante. Un'opzione potrebbe essere quella di creare un'app minima per caricare solo i dati iniziali, creare una migrazione e, in RunPython, chiamare le funzioni che Django utilizza per caricare i dispositivi. In questo modo puoi anche specificare le dipendenze nella tua migrazione. Tuttavia, probabilmente richiederebbe qualche serio scavo nel codice sorgente di Django. –

+2

Sì, ho pensato di creare una sorta di * meta * application come ultima risorsa e di creare le migrazioni lì (ma è ancora brutto). Mi chiedo perché il nuovo Django non fornisca almeno un modo standard di ** dichiarativamente ** specificando i dispositivi da caricare insieme alle nuove Migrazioni. –

+0

Da qualche parte su SO è stato suggerito di riutilizzare i file di dispositivi json/xml precedenti alla 1.7. Avresti un'app minima con una semplice migrazione dei dati, quindi analizzerai i tuoi dispositivi json/xml esistenti e creerai record da essi. Questo dovrebbe essere quello che è successo pre-1.7 comunque. –

risposta

4

Se si desidera utilizzare assolutamente proiettori, utilizzare solo RunPython e call_command nelle migrazioni dei dati.

from django.db import migrations 
from django.core.management import call_command 

def add_data(apps, schema_editor): 
    call_command('loaddata', 'thefixture.json') 

def remove_data(apps, schema_editor): 
    call_command('flush') 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('roundtable', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(
      add_data, 
      reverse_code=remove_data), 
    ] 

Tuttavia questo recommanded per caricare i dati utilizzando il codice Python e Django ORM, come non si devono affrontare problemi di integrità.

Source.

+1

Questa è la risposta corretta e sembra provenire da questa eccellente discussione sull'argomento. http://andrewsforge.com/article/upgrading-django-to-17/part-2-migrations-in-django-16-and-17/#initial-data-fixtures-and-data-migrations – shacker

+0

Ho appena visto il [talk] (https://www.youtube.com/watch?v=bjIXZ-XX2SM) di Andrew Pinkham che lo spiega bene, quindi questa sembra davvero la strada da percorrere. Come dice: "Il sistema initial_data è un problema quando usato in tandem con le migrazioni"; ecco perché "Il sistema initial_data è sparito, ma le fixture non lo sono". Avviso –

+1

: il comando 'flush' come mostrato qui rimuoverà _all_ dati, non solo i dati dalla migrazione in avanti – wim

1

Consiglio di utilizzare le fabbriche al posto degli infissi, sono un disastro e di difficile manutenzione, meglio usare FactoryBoy con Django.

+1

Non penso che le fixture siano difficili da mantenere, sono state finora uno strumento abbastanza preferito e sono una funzionalità integrata. Non mi sento a mio agio usando un'app di terze parti come FactoryBoy per un compito così semplice come il caricamento dei dati. Penso che sia eccessivo per questo scopo. Dopotutto, FactoryBoy è destinato a test di unità complessi, come un generatore di dati avanzato. Questo è molto lontano dalla portata del mio scopo: semplice caricatore di dati statici. Ma grazie per l'informazione comunque. –

Problemi correlati