Zaten gönderilen cevapları geçti. Sadece gerçek örnekle bir cevap eklersem daha iyi olacağını düşündüm.
Diyelim ki ilgili 3 Django modeliniz var.
class M1(models.Model):
name = models.CharField(max_length=10)
class M2(models.Model):
name = models.CharField(max_length=10)
select_relation = models.ForeignKey(M1, on_delete=models.CASCADE)
prefetch_relation = models.ManyToManyField(to='M3')
class M3(models.Model):
name = models.CharField(max_length=10)
Burada sorgulayabilir M2modeli ve onun göreceli M1kullanarak nesneleri select_relationalanını ve M3kullanan nesnelerin prefetch_relationalanını.
Daha önce de belirttiğimiz Ancak olarak M1gelen 'ın ilişkisini M2bir olduğunu ForeignKey, sadece sadece döner 1 herhangi bir kayıt M2nesnesi. Aynı şey için OneToOneFieldde geçerlidir .
Fakat M3'dan ilişkisi herhangi bir sayıdaki nesneyi döndüren M2bir ilişkidir .ManyToManyFieldM1
Eğer 2 var bir durumu düşünün M2nesneleri m21, m22aynısından 5 ilişkili M3kimlikleri ile nesneleri 1,2,3,4,5. Bu M3nesnelerin her biri için ilişkili nesneleri getirdiğinizde M2, related ile ilgili seçeneğini kullanırsanız, bu nasıl çalışır.
Adımlar:
m21Nesneyi bul .
- Kimlikleri olan
M3nesnelerle ilgili tüm nesneleri sorgulayın .m211,2,3,4,5
- Aynı şeyi
m22nesne ve diğer tüm M2nesneler için tekrarlayın .
Biz aynı olması gibi 1,2,3,4,5her ikisi için kimlikleri m21, m22biz seçeneği select_related kullanmak eğer, zaten getirilen vardı aynı kimlikler için iki kez DB sorgulamak için gidiyor, itiraz ediyor.
Bunun yerine prefetch_related kullanırsanız, M2nesneleri almaya çalıştığınızda , M2tablo sorgulanırken ve son adım olarak Django M3tabloya bir sorgu yapacak. M2nesnelerinizin döndürdüğü tüm kimlikler kümesiyle . ve bunları M2veritabanı yerine Python kullanarak nesnelere birleştirin .
Bu şekilde, tüm M3nesneleri yalnızca bir kez sorgulayarak performansı artırırsınız.