Arama butonu
Bu konudaki kullanıcılar: 1 misafir
5
Cevap
306
Tıklama
1
Öne Çıkarma
Django Query Optimizasyon Paketi
T
5 yıl
Er
Konu Sahibi

Herkese merhaba arkadaşlar,

Şirket içinde bazı projelerimizde yaşadığımız n+1 hit problemlerinden dolayı django-rest serializerlarını otomatik olarak select_related, prefetch_related, only, values gibi django metodları ile optimize eden bir paket hazırlamıştım bu paketi meraklısına veya benzer problemleri yaşamış olanlara inceleyebilmesi, kullanabilmesi, fikir vermesi adına github üzerinden paylaştım.

Nasıl çalıştığını readme üzerinde detaylıca anlatmaya çalıştım. Kodu da temiz ve yorumlarla destekleyerek yazmaya çalıştım anlaşılabilmesi adına. Geri dönüşleriniz olursa mutlu olur ve zevkle değerlendiririm.

GitHub linki: django-auto-related

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



C
5 yıl
Yüzbaşı

Helal olsun elinize sağlık 👍🏼👍🏼👍🏼



< Bu ileti mini sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
A
5 yıl
Yarbay

merhaba hocam,
paylaşım için teşekkür ederiz. n+1 problemi nedir acaba biraz daha açabilir misiniz? teşekkürler.


Bu mesaja 1 cevap geldi.
T
5 yıl
Er
Konu Sahibi

quote:

Orijinalden alıntı: anaksimenes35

merhaba hocam,
paylaşım için teşekkür ederiz. n+1 problemi nedir acaba biraz daha açabilir misiniz? teşekkürler.
n+1 problemi django-orm yada sqlalchemy gibi sql kullanmadan database ile uğraşmanızı yarayan paketlerin yan etkilerinden biri. Normalde djangoda şöyle bir kod yazmanız oldukça muhtemel:

class ModelA(Model):
relation_field=ForeignKey('ModelB')

class ModelB(Model):
name=CharField()

for obj in ModelA.objects.all():
print(obj.relation_field.name)

Bu for loop'u normal bir python loopu gibi görünüyor fakat django querysetleri lazy evaluation kullandığı için aslında her iteration'da bir database access'i yani io işlemi yapıyorsunuz. Normalde bir join yapıp tek query ile alabileceğiniz bir bilgiyi. N+1 sorgu yaparak alıyorsunuz. N burda ModelA class'ına ait obje sayısı oluyor. +1 ise .all() ile biten queryden kaynaklanıyor. Orm kullanıldığı zaman bu tarz hataların gözden kaçması çok muhtemel o yüzden dikkatli olunması gerekiyor çünkü çok küçük bir db ile bile çalışırken büyük performans kayıplarını yol açabiliyor bu problem eğer modelleriniz biraz fazla nested relational fieldlar barındırıyor ise.

Hele bir de django-rest-framework ile kullandığınız zaman araya bir layer daha eklendiği için bunun gözden kaçması çok daha olası oluyor. Django'nun buna çözümü ise select_related ve prefetch_related metodları. Bu metodlar bildiğimiz sql joinleri yaparak tek seferde bütün verinin getirilmesini sağlıyor. (Prefetch_related tam olarak sql joini yapmıyor yanlış bilgi vermiş gibi olmayayım ama mantığı aynı)





< Bu mesaj bu kişi tarafından değiştirildi tarbantino -- 14 Ağustos 2020; 12:47:14 >

T
5 yıl
Er
Konu Sahibi

quote:

Orijinalden alıntı: CarnageTR

Helal olsun elinize sağlık 👍🏼👍🏼👍🏼
Teşekkürler



H
5 yıl
Binbaşı

up



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.