Django: Оптимизация подсчета запросов к БД
У меня есть модели (один пользователь может иметь несколько сотрудников):
from django.db import models
class User(models.Model):
username = ...
first_name = ...
last_name = ...
class OrgUnit(models.Model):
name = ....
address = ...
class Employee(models.Model):
personnel_no = ...
user = models.ForeignKey(User, related_name='employees'...)
orgunit = models.ForeignKey(OrgUnit, ...)
Сериализаторы и представления:
class EmployeeSerializer(serializers.ModelSerializer):
orgunit = serializers.CharField(source='orgunit.name') <==== one orgunit - one query to DB
class Meta:
model = Employee
fields = '__all__'
class CustomUserSerializer(serializers.ModelSerializer):
employees = EmployeeSerializer(many=True)
class Meta:
model = User
fields = '__all__'
class UsersViewSet(ViewSet):
def me(self, request):
serializer = CustomUserSerializer(request.user)
return Response(serializer.data)
При сериализации orgunit.name для одного orgunit выполняется один запрос к БД. Как избежать этого? Как предварительно получить employees related_name и его orgunits?
В этом случае вы можете использовать Prefetch...[Django-doc] и prefetch_related_objects...[Django-doc] для получения всех связанных сотрудников с выбранными orgunit:
from django.db.models import Prefetch, prefetch_related_objects
class UsersViewSet(ViewSet):
def me(self, request):
prefetch_related_objects(
[request.user],
Prefetch(
"employees",
queryset=Employee.objects.select_related("orgunit"),
),
)
serializer = CustomUserSerializer(request.user)
return Response(serializer.data)