Django Dumpdata & Loaddata Komutları

Kader Miyanyedi
3 min readMay 19, 2022

--

Herkese selamlar! Yeni bir yazıya hoş geldiniz.

Bir django projesi oluşturduğumuzda veya ayağa kaldırdığımızda kullanacağımız verileri tekrar tekrar oluşturmak zaman kaybına yol açmaktadır. Verilerimizi bir kez hazırladıktan sonra bu verileri kullanacağımız zaman tekrar yükleyebiliriz. Başlangıç verilerini migrationlar veya fixtures yardımı ile oluşturabiliriz. Bu yazımızda django fixtures yapısına ve dumpdata/loaddata komutlarına göz atacağız.

Fixtures; örnek başlangıç verilerini içeren veritabanının bir çıktısıdır. Bir fixtures JSON, XML veya YAML formatında olabilir.(YAML formatı için PyYAML kütüphanesinin yüklü olması gereklidir).

Daha önceki yazımızda hazırlamış olduğumuz country ve product modellerini bu yazıda da kullanacağız. Projenin kaynak kodlarına buradan ulaşabilirsiniz.

Country modelimize ait örnek bir JSON fixtures şu şekildedir:

Dumpdata ile fixture oluşturmak

Veritabanında bulunan verilerin çıktılarını alarak bir fixture oluşturmak için dumpdata komutunu kullanabilirsiniz. Bu komutu kullanmadan önce shell veya admin paneli üzerinden data yüklediğinizden emin olun.

Dumpdata komutu varsayılan olarak JSON formatında çıktı üretir.

python manage.py dumpdata product.product --indent 5 >> product.json
  • format: JSON dışında farklı bir formatta çıktı almak istediğimizde kullanırız.
  • output: Çıktının kayıt edileceği dosyanın ismidir.
  • exclude: Django varsayılan olarak tüm modellerin çıktısını alır. Exclude ile fixture dışında tutulacak modelleri belirleyebiliriz.
  • indent: Çıktıda kullanılacak girinti sayısını belirler. Varsayılan olarak tüm çıktılar tek bir satırda görüntülenir.
python manage.py dumpdata product.product --format yaml --output product.yaml

Loaddata ile fixture dosyalarını yüklemek

Oluşturduğunuz fixture dosyalarını loaddata komutu ile yükleyebilirsiniz.

python manage.py loaddata country.yaml

Django loaddata komutu yürütüldüğünde fixture için 3 konumda arama yapar:

  • Her uygulama altında yer alan fixtures klasöründe
  • settings.py içerisinde belirtilen FIXTURE_DIRS ayarının belirtiği dizinde
  • loaddata komutu sırasında verilen dosya yolunda

Loaddata komutunun kullanımı ardından yüklenen nesne sayısını görebileceğimiz aşağıdaki gibi bir çıktı ile karşılaşırız:

Önemli Noktalar

  • Fixture dosyaları işlendiğinde veriler veritabanına doğrudan kayıt edilir. Modelde tanımlı save() methodu çağrılmaz.
  • Fixture dosyaları işlenirken belirli bir sıra yoktur. Bu sebeple birden fazla dosya yüklerken birbirine bağlı modellerde hangi fixture dosyasının daha önce işlenmesi gerektiğinden emin olun.
  • Uygulama içerisinde veritabanı seviyesinde kısıtlamalar(constraints) varsa fixture yüklenmesi sonunda bu kısıtlamalar kontrol edilir.
  • Aynı fixture dosyasını tekrar tekrar yüklemeye çalıştığınızda veritabanına yeni bir kayıt oluşmaz. Dosya içerisinde bir değişiklik varsa fixture dosyası tekrar işlenir.
  • Fixture dosyaları işlenirken, veritabanında dosya içerisinde yer alan verilerden farklı veriler var olabilir. Bu durumda aynı birincil anahtara(primary key, pk) sahip veriler üzerine yazma işlemi yapılır.

Fixture dosyalarını testlerimiz sırasında da kullanabiliriz.

from django.test import TestCase
from address.models import Country

class CountryTests(TestCase):
fixtures = ["country.yaml"]

def test_country_name(self):
country = Country.objects.get(pk=1)
self.assertEqual(country.name, "Turkey")

Bu yazımızda bir django projeside başlangıç verileri oluşturmak için dumpdata, loaddata komutlarının nasıl kullanıldığını ve fixture yapısını öğrendik. Umarım keyifli ve faydalı bir yazı olmuştur. Bir sonraki yazıda görüşmek üzere!

Kaynaklar

[1] https://docs.djangoproject.com/en/4.0/howto/initial-data/
[2] https://docs.djangoproject.com/en/4.0/ref/django-admin/#dumpdata
[3] https://docs.djangoproject.com/en/4.0/ref/django-admin/#loaddata

--

--