Middle
Kada u Django ORM-u praviš upite sa povezanim modelima, kako izbegavaš suvišne SQL upite? Koja dva ORM mehanizma poznaješ?
sobes.tech АИ
Одговор од АИ
U Django ORM-u, da biste izbegli suvišne SQL upite prilikom rada sa povezanim modelima, koriste se dva osnovna mehanizma:
-
select_related — izvršava SQL JOIN i učitava povezane objekte u istom upitu. Radi za polja ForeignKey i OneToOne.
-
prefetch_related — izvršava poseban upit za povezane objekte i povezuje ih u Pythonu. Pogodno za ManyToMany i obrnute veze.
Primer:
# Bez optimizacije
books = Book.objects.all()
for book in books:
print(book.author.name) # za svaku knjigu poseban upit za autora
# Sa select_related
books = Book.objects.select_related('author').all()
for book in books:
print(book.author.name) # jedan upit sa JOIN-om
# Sa prefetch_related za ManyToMany
books = Book.objects.prefetch_related('tags').all()
for book in books:
for tag in book.tags.all():
print(tag.name)
Korišćenje ovih metoda značajno smanjuje broj upita i poboljšava performanse.