mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-10-22 19:54:50 +03:00
Add documentation on avoiding N+1 queries using select_related/prefetch_related
This commit is contained in:
parent
577bb3c819
commit
515c434a5b
|
@ -102,6 +102,39 @@ For example:
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Avoiding N+1 Queries
|
||||||
|
|
||||||
|
When listing objects (e.g. using `ListAPIView` or `ModelViewSet`), serializers may trigger an N+1 query pattern if related objects are accessed individually for each item.
|
||||||
|
|
||||||
|
To prevent this, optimize the queryset in `get_queryset()` or by setting the `queryset` class attribute using [`select_related()`](https://docs.djangoproject.com/en/stable/ref/models/querysets/#select-related) and [`prefetch_related()`](https://docs.djangoproject.com/en/stable/ref/models/querysets/#prefetch-related), depending on the type of relationship.
|
||||||
|
|
||||||
|
**For ForeignKey and OneToOneField**:
|
||||||
|
|
||||||
|
Use `select_related()` to fetch related objects in the same query:
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return Order.objects.select_related("customer", "billing_address")
|
||||||
|
|
||||||
|
**For reverse and many-to-many relationships**:
|
||||||
|
|
||||||
|
Use `prefetch_related()` to efficiently load collections of related objects:
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return Book.objects.prefetch_related("categories", "reviews__user")
|
||||||
|
|
||||||
|
**Combining both**:
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return (
|
||||||
|
Order.objects
|
||||||
|
.select_related("customer")
|
||||||
|
.prefetch_related("items__product")
|
||||||
|
)
|
||||||
|
|
||||||
|
These optimizations reduce repeated database access and improve list view performance.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
#### `get_object(self)`
|
#### `get_object(self)`
|
||||||
|
|
||||||
Returns an object instance that should be used for detail views. Defaults to using the `lookup_field` parameter to filter the base queryset.
|
Returns an object instance that should be used for detail views. Defaults to using the `lookup_field` parameter to filter the base queryset.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user