Django, kutudan çıktığı hâliyle güçlü ve esnek bir yönetici arayüzü sunar. Verileri görüntülemek, günlük rutin görevleri gerçekleştirmek veya CRUD işlemlerini yürütmek için oldukça kullanışlıdır.
Sufle olarak Django'yu yoğun bir şekilde kullanıyoruz ve Django Admin günlük operasyonlarımızın bir parçası. Projelerimizden birinde başlangıçta hızlı ve güvenilir bir şekilde çalışıyordu. Ancak tablolarımız milyonlarca satıra ulaşmaya başladığında, arama işlemlerinin çoğu zaman yavaşladığını ve zaman aşımı hatalarıyla karşılaştığımızı gördük. Verilerimiz büyümeye devam ederken Django Admin ile nelerin iyi çalıştığı, nelerin çalışmadığı konusunda çok şey öğrendik. Bazı basit düzenlemelerle büyük veri kümelerinde bile yönetici arayüzünü kullanmaya devam etmek mümkün. İşte bizim deneyimlerimizden elde ettiğimiz ve sizin için de işe yarayabilecek yöntemler.
get_queryset Metodunu Özelleştirin
Öncelikle, yabancı anahtarlar ve hesaplanan alanlar için her satırda ek sorgular çalıştırmaya gerek yoktur. Her nesne için birden fazla sorgu gerçekleştirmek, yanıt sürelerinin önemli ölçüde uzamasına neden olabilir.
Burada yapabileceğiniz şey, model yönetici sınıfınızdaki get_queryset metodunu yeniden tanımlamaktır. Yabancı anahtarlarınız için select_related kullanabilirsiniz.
class MyModelAdmin(ModelAdmin): def get_queryset(self, request): queryset = super().get_queryset(request) return queryset.select_related('foreign_key_1', 'foreign_key_2')
Alternatif olarak, sorgu sayısını azaltmak için annotate kullanabilirsiniz.
class MyModelAdmin(ModelAdmin): def get_queryset(self, request): queryset = super().get_queryset(request) return queryset.annotate(field_count=Count('field'))
DjangoQL ile Aramayı Güncelleyin
Standart arama işlevi iyi çalışır; ancak veri kümesi milyonlarca satıra ulaştığında arama önemli bir sorun hâline gelir. search_fields içinde birden fazla alan bulunduğunda SQL sorgusu, art arda zincirlenmiş birden fazla JOIN ifadesi içerir. Bu sorunu çözmek için DjangoQL paketini kullanmaya başladık.
DjangoQLSearchMixin, standart Django aramasının yerini DjangoQL aramasıyla değiştirir. DjangoQL, ilişkili alanlar da dâhil olmak üzere yalnızca belirtilen alanlarda arama yapmamızı sağlar. Tek yapmanız gereken DjangoQLSearchMixin sınıfını model yöneticinize eklemektir:
from djangoql.admin import DjangoQLSearchMixinclass MyModelAdmin(DjangoQLSearchMixin, ModelAdmin): pass
DjangoQL; model alanları için otomatik tamamlama, mantıksal operatörler, parantezler ve tablo birleştirme işlemlerini destekler. Yalnızca birkaç satır kodla birden fazla JOIN ifadesinden kurtulabilir ve search_fields alanlarını sabit kodlarla tanımlamak yerine, sınırlama olmadan aramak istediğiniz verilere odaklanabilirsiniz.
COUNT Sorgularını Ortadan Kaldırın
Belirli bir veri boyutuna ulaşıldığında maliyetli COUNT(*) sorguları change_list üzerinde yük oluşturmaya ve zaman aşımı hatalarına neden olmaya başlar.
Tercih ettiğimiz çözüm MySQL ve doğal olarak Django'nun yerleşik MySQL desteğini genişletmek için Django-MySQL paketini kullanıyoruz. Bu paket, tablonun kesin kayıt sayısı yerine yaklaşık kayıt sayısını döndüren kullanışlı count_tries_approx metodunu içerir. Böylece InnoDB üzerinde tüm tablonun taranmasını önlüyor ve çok daha hızlı sonuçlar elde ediyoruz.
Önce:
SELECT COUNT(*) AS `__count` FROM `mytable`
count_tries_approx sonrasında:
SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'mytable'
Bu faydalı yöntemlerin, sisteminizi ölçeklendirip büyütürken Django Admin'i kullanmaya devam etmenize yardımcı olmasını umuyoruz.