Конечная точка 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, то есть количество запросов очень велико:-
Могу ли я получить какую-либо помощь по этому вопросу.
Модель групп и разрешений - это модель по умолчанию, которая поставляется с 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