Ş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.
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 >
Ş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 Ol Şimdi DeğilÜ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.