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 M2
modeli ve onun göreceli M1
kullanarak nesneleri select_relation
alanını ve M3
kullanan nesnelerin prefetch_relation
alanını.
Daha önce de belirttiğimiz Ancak olarak M1
gelen 'ın ilişkisini M2
bir olduğunu ForeignKey
, sadece sadece döner 1 herhangi bir kayıt M2
nesnesi. Aynı şey için OneToOneField
de geçerlidir .
Fakat M3
'dan ilişkisi herhangi bir sayıdaki nesneyi döndüren M2
bir ilişkidir .ManyToManyField
M1
Eğer 2 var bir durumu düşünün M2
nesneleri m21
, m22
aynısından 5 ilişkili M3
kimlikleri ile nesneleri 1,2,3,4,5
. Bu M3
nesnelerin 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:
m21
Nesneyi bul .
- Kimlikleri olan
M3
nesnelerle ilgili tüm nesneleri sorgulayın .m21
1,2,3,4,5
- Aynı şeyi
m22
nesne ve diğer tüm M2
nesneler için tekrarlayın .
Biz aynı olması gibi 1,2,3,4,5
her ikisi için kimlikleri m21
, m22
biz 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, M2
nesneleri almaya çalıştığınızda , M2
tablo sorgulanırken ve son adım olarak Django M3
tabloya bir sorgu yapacak. M2
nesnelerinizin döndürdüğü tüm kimlikler kümesiyle . ve bunları M2
veritabanı yerine Python kullanarak nesnelere birleştirin .
Bu şekilde, tüm M3
nesneleri yalnızca bir kez sorgulayarak performansı artırırsınız.