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)
Вернуться на верх