Django:数据库查询计数优化

Django: DB queries count optimization

我有模型(一个用户可以有多个员工):

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 时,正在执行对数据库的一个查询。如何避免这种情况?如何预取 employees related_name 及其 orgunits?

在这种情况下,您可以使用 Prefetch..[Django-doc] and 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)