Django Rest Framework показывает ValueError: невозможно использовать QuerySet для «Post»: используйте QuerySet для «Account» - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь составить список любимых сообщений пользователей и разбить их на страницы. У меня есть фрагмент пользовательского пагинации от so, который я использую здесь, но я получаю эту ошибку. ValueError: невозможно использовать QuerySet для «Post»: используйте QuerySet для «Account».

Я думаю, есть проблемы с моим сериализатором или представлениями. может ли кто-нибудь помочь мне решить эту проблему?

Это коды:

сериализаторы:

class PostSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')
    post_date = serializers.ReadOnlyField()
    comment_set = CommentSerializer(many=True)
    class Meta:
        model = Post
        fields = ['id','title', 'post_date', 'user', 'image', 'comment_set']



class PostFavouriteListSerializer(serializers.ModelSerializer):
    favourite = PostSerializer(many=True, read_only=True)
    class Meta:
        model = Post
        fields = ['favourite',]

просмотров

class CustomPaginator(PageNumberPagination):
    page_size = 3

    def generate_response(self, query_set, serializer_obj, request):
        try:
            page_data = self.paginate_queryset(query_set, request)
        except NotFoundError:
            return Response({"error": "No results found for the requested page"}, status=status.HTTP_400_BAD_REQUEST)

        serialized_page = serializer_obj(page_data, many=True)
        return self.get_paginated_response(serialized_page.data)

class FavouritePostAPIView(APIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        user = self.request.user
        favourite_posts = Post.objects.filter(favourite=user.post_favourite.all())
        paginator = CustomPaginator()
        response = paginator.generate_response(post, PostFavouriteListSerializer, request)
        return response

Это Модель сообщения:

class Post(models.Model):
    title = models.TextField(max_length=5000, blank=False, null=False)
    image = models.ImageField(upload_to='posts/postimage/', null=True)
    post_date = models.DateTimeField(auto_now_add=True, verbose_name="Date Posted")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    slug = models.SlugField(blank=True, unique=True, max_length=255)
    favourite = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='post_favourite', blank=True)

Отслеживание:

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py" in dispatch
  505.             response = self.handle_exception(exc)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py" in handle_exception
  465.             self.raise_uncaught_exception(exc)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py" in raise_uncaught_exception
  476.         raise exc

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rest_framework\views.py" in dispatch
  502.             response = handler(request, *args, **kwargs)

File "C:\danny\Project\posts\api\views.py" in get
  186.      favourite_posts = Post.objects.filter(favourite=user.post_favourite.all())

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py" in filter
  892.         return self._filter_or_exclude(False, *args, **kwargs)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\query.py" in _filter_or_exclude
  910.             clone.query.add_q(Q(*args, **kwargs))

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py" in add_q
  1290.         clause, _ = self._add_q(q_object, self.used_aliases)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py" in _add_q
  1315.                 child_clause, needed_inner = self.build_filter(

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py" in build_filter
  1224.             self.check_related_objects(join_info.final_field, value, join_info.opts)

File "C:\Users\danny\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\sql\query.py" in check_related_objects
  1079.                 raise ValueError(

Exception Type: ValueError at /api/posts/posts/favourites/
Exception Value: Cannot use QuerySet for "Post": Use a QuerySet for "Account".

1 Ответ

0 голосов
/ 01 августа 2020

заменить:

favourite_posts = Post.objects.filter(favourite=user.post_favourite.all())
    paginator = CustomPaginator()
    response = paginator.generate_response(post, PostFavouriteListSerializer, request)

на:

favourite_posts = user.post_favourite.all()
    paginator = CustomPaginator()
    response = paginator.generate_response(favourite_posts, PostSerializer, request)

соответствующий m2m post_favourite представляет собой набор запросов сообщения, не нужно фильтровать / получать это, поэтому вам не нужно PostFavouriteListSerializer

альтернатива может быть такой:

favourite_posts = Post.objects.filter(favourite=user)

вы получаете все сообщения с избранным у вашего пользователя

...