2017-01-10 2 views
1

TLDR: Я хотел бы сериализовать группу вместе с ее именем разрешений. Но появилось много повторяющихся запросов content_type из Permission Model. Я попытался решить эту проблему с помощью предварительной выборки, но не работал. Что я делаю не так?отображение групповых разрешений, вызывающих повторяющиеся запросы в django

поэтому мой сериализатору для извлечь метод приведен ниже

class RetrieveGroupSerializer(serializers.ModelSerializer): 
    user_set = UserSerializer(many=True, read_only=True) 
    permissions = PermissionsSerializer(many=True, read_only=True) 

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

сериализатором для метода списка приведен ниже

class GroupSerializer(serializers.ModelSerializer): 
    user_set = UserSerializer(many=True) 
    permissions = PermissionsSerializer(many=True) 

    class Meta: 
     model = Group 
     fields = ('url', 'user_set', 'permissions') 

взглядов приводится ниже

class GroupViewSet(
        mixins.CreateModelMixin, 
        mixins.RetrieveModelMixin, 
        mixins.UpdateModelMixin, 
        mixins.ListModelMixin, 
        viewsets.GenericViewSet): 
    """ 
    Creates, Updates, and retrives User Groups 
    """ 

    queryset = Group.objects.all().prefetch_related('user_set').prefetch_related('permissions__content_type') 
    serializer_class = GroupSerializer 
    permission_classes = (
     IsAuthenticated, 
    ) 
    action_serializer_classes = { 
     "create": CreateGroupSerializer, 
     "retrieve": RetrieveGroupSerializer, 
     "update": UpdateGroupSerializer 
    } 

    def get_serializer_class(self): 
     try: 
      return self.action_serializer_classes[self.action] 
     except (KeyError, AttributeError): 
      return super(GroupViewSet, self).get_serializer_class() 

Когда я использую метод списка Я не сталкиваюсь с любыми повторяющимися запросами, но когда я использую метод извлечения на любом si ngle group instance Я получаю много повторяющихся запросов. django-debug-toolbar output

Как вы можете видеть, content_type из Permission Model запрашивается 62 раза. Таким образом, я использовал prefetch_related для внешнего ключа в модели разрешений. Но результат тот же.

Но тот же набор запросов хорошо работает для метода List и не вызывает повторяющихся запросов. вы можете видеть, что ниже

Помимо проблемы с дублирующимися запросами, я также смущен, как тот же запрос может вызывать такие разные результаты?

ответ

2

Это, вероятно, потому, что API-интерфейс, доступный для просмотра, также отображает форму создания/обновления, которая имеет выпадающий список с типами содержимого и не будет использовать оптимизацию предварительной выборки. Постарайтесь получить его как JSON и посмотреть, сколько запросов он выполняет или удалить разрешения для обновлений, чтобы увидеть, изменит ли он количество запросов.

+0

Спасибо. проблемы там не было, просто используя JSON. – StarLord

+0

Я с ума сходил с этими дубликатами, спасибо за этот ответ. – Alberick0

+0

Рад, что это помогло. К сожалению, это не очевидно, что формам create/update также нужны некоторые запросы к БД для отображения самих себя. – Linovia

Смежные вопросы