Конечная точка API для модели django `Group`, генерирующей избыточное количество запросов

Я пытаюсь создать конечную точку для стандартной модели django Group, которая имеет name и permissions поля:- Вот мое представление и сериализаторы:-

Serializers.py:-

class GroupSerializer(serializers.ModelSerializer):

    class Meta:
        model = Group
        fields = ('id', 'name', 'permissions')

    def create(self, validated_data):
        permissions = validated_data.pop('permissions')
        instance = self.instance or self.Meta.model(**validated_data)
        instance.full_clean()
        instance.save()
        instance.permissions.add(*permissions)
        return instance

    def update(self, instance, validated_data):
        if 'permissions' in validated_data:
            permissions = validated_data.pop('permissions')
            instance.permissions.clear()
            instance.permissions.add(*permissions)
        instance.full_clean()
        return super().update(instance, validated_data)

Views.py:-

class GroupListCreateView(ListCreateAPIView):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer


class GroupDetailView(RetrieveUpdateDestroyAPIView):
    queryset = Group.objects.order_by('name')
    serializer_class = GroupSerializer

С этими сериализаторами и представлениями я сталкиваюсь с проблемой, которая известна как проблема N+1, то есть количество запросов очень велико:-

enter image description here

enter image description here

enter image description here

Могу ли я получить какую-либо помощь по этому вопросу.

Модель групп и разрешений - это модель по умолчанию, которая поставляется с django (копирую ее):-

class Group(models.Model):
    objects: GroupManager

    name = models.CharField(max_length=150)
    permissions = models.ManyToManyField(Permission)

class Permission(models.Model):
    content_type_id: int
    objects: PermissionManager

    name = models.CharField(max_length=255)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    codename = models.CharField(max_length=100)

Ссылка на модель в документации:- https://docs.djangoproject.com/en/3.2/ref/contrib/auth/#permission-model

Вернуться на верх