Django 1.7 ile ilk veri yükleme ve veri göçler
Geçenlerde 1.7 ve göçler (ben hiç Güney kullanılan) kullanmaya başladı için Django 1.6 değiştirdi.
Önce fixture/initial_data.json
Bir dosya ile ilk veri yükleme için kullanılır, python manage.py syncdb
komutu ile yüklü olan 1.7, veritabanı oluşturma.
Şimdi, göçler kullanmaya başladım, ve bu davranış önerilmiyor :
Eğer bir uygulama göçler kullanıyorsa, Fikstür otomatik yükleme yok. Göçler Django uygulamaları için gerekli olacaktır, çünkü 2.0, bu davranış, itiraz kabul edilir. Eğer bir uygulama için ilk veri yüklemek istiyorsanız, bir veri geçiş yapmayı düşünün. (https://docs.djangoproject.com/en/1.7/howto/initial-data/#automatically-loading-initial-data-fixtures)
official documentation bunu yapmak için nasıl açık bir örnek yok, benim sorum ise şu :
Bu ilk veri, veri göçler kullanarak almak için en iyi yolu nedir :
mymodel.create(...)
, birden çok çağrı ile Python kodu yazmak- Ya Fikstür JSON dosyasından veri yüklemek için Django bir işlev (like calling
loaddata
) kullanın yazın.
İkinci seçeneği tercih ederim.
Django bunu yapmak mümkün gibi görünüyor, Güney kullanmak istemiyorum, doğal olarak şimdi.
Teşekkürler !
CEVAP
Bir Fikstür olduğunu varsayarsak <yourapp>/fixtures/initial_data.json
dosya
Boş geçiş oluşturun:
İçinde Django 1.7:
python manage.py makemigrations --empty <yourapp>
1.8 , bir ad sağlar: Django
python manage.py makemigrations --empty <yourapp> --name load_intial_data
Geçiş
<yourapp>/migrations/0002_auto_xxx.py
dosyasını düzenleyin2.1. Özel uygulama,' 14* *(ilk cevap): . Django esinlenerek
import os from sys import path from django.core import serializers fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) fixture_filename = 'initial_data.json' def load_fixture(apps, schema_editor): fixture_file = os.path.join(fixture_dir, fixture_filename) fixture = open(fixture_file, 'rb') objects = serializers.deserialize('json', fixture, ignorenonexistent=True) for obj in objects: obj.save() fixture.close() def unload_fixture(apps, schema_editor): "Brutally deleting all entries for this model..." MyModel = apps.get_model("yourapp", "ModelName") MyModel.objects.all().delete() class Migration(migrations.Migration): dependencies = [ ('yourapp', '0001_initial'), ] operations = [ migrations.RunPython(load_fixture, reverse_code=unload_fixture), ]
2.2.
load_fixture
için basit bir çözüm @juliocesar önerisine göre ():from django.core.management import call_command fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) fixture_filename = 'initial_data.json' def load_fixture(apps, schema_editor): fixture_file = os.path.join(fixture_dir, fixture_filename) call_command('loaddata', fixture_file)
Eğer özel bir dizin kullanmak için kullanışlı.
2.3.Basit:
app_label
loaddata
arama<yourapp>
yük armatürleri'fixtures
s otomatik dir :from django.core.management import call_command fixture = 'initial_data' def load_fixture(apps, schema_editor): call_command('loaddata', fixture, app_label='yourapp')
Eğer
app_label
belirtin musun diye loaddatafixture
dosya yüklemek için çalışacağıztümapps armatürleri dizinleri muhtemelen istemiyorum.Çalıştırın
python manage.py migrate <yourapp>
Nerede'in gelen Django benim iste...
Django iş mantığı ve veri erişim ayırm...
Nasıl herhangi bir önbelleğe ve yenide...
Tek bir Model İçin Django Dökümü Veri?...
Nasıl bootstrap kalıcı AJAX sunucudan ...