SORU
21 EYLÜL 2014, Pazar


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 :

  1. mymodel.create(...), birden çok çağrı ile Python kodu yazmak
  2. 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
22 EYLÜL 2014, PAZARTESİ


Bir Fikstür olduğunu varsayarsak <yourapp>/fixtures/initial_data.json dosya

  1. 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
    
  2. Geçiş <yourapp>/migrations/0002_auto_xxx.py dosyasını düzenleyin

    2.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 loaddata fixture dosya yüklemek için çalışacağıztümapps armatürleri dizinleri muhtemelen istemiyorum.

  3. Çalıştırın

    python manage.py migrate <yourapp>
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrea Lewis

    Andrea Lewis

    14 Mart 2013
  • inovationgmbh

    inovationgmb

    28 EYLÜL 2010
  • SoundHound

    SoundHound

    8 Mart 2006