Платформа Django REST - заставить запрос на включение фильтра в ModelViewSet

У меня есть 2 модели в моем приложении:

class Comment(models.Model):
    content = models.TextField('Content')
    blog = models.ForeignKey('Blog', on_delete=models.CASCADE, related_name='comments')

class Blog(models.Model):
    content = models.TextField('Content')

Я использую ModelViewSet в своих представлениях для получения и создания объектов, и он отлично работает.

Моя проблема: я хочу получить все комментарии для определенного объекта блога, поэтому я создал CommentViewSet (который наследуется от ModelViewSet):

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = CommentFilter


    def perform_create(self, serializer):
        try:
            serializer.save(user=self.request.user)
        except ValidationError as e:
            raise NotAcceptable(e.message)

Я могу использовать такой фильтр mysite.com/comment/?blog=X, чтобы сделать это, но я хочу запретить пользователю запрашивать все комментарии без этого фильтра (mysite.com/comment/ всегда будет возвращать все комментарии, и это плохо...)

Является ли это возможным?

Спасибо!

R


person Rani    schedule 19.07.2016    source источник
comment
Добавьте свое мнение в вопросе   -  person Usman Maqbool    schedule 19.07.2016
comment
Я добавил CommentViewSet   -  person Rani    schedule 19.07.2016


Ответы (1)


Взяв пример документации, вы нужно вернуть пустой QuerySet вместо полного набора запросов в последнем возврате:

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        Optionally restricts the returned purchases to a given user,
        by filtering against a `username` query parameter in the URL.
        """
        queryset = Purchase.objects.all()
        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        return queryset.none()
person Linovia    schedule 19.07.2016
comment
ХОРОШО. Я думаю, что скорее вызову исключение, чем пустой результат, но это легко изменить. Спасибо! - person Rani; 19.07.2016
comment
Кстати, это лучше, чем создание функции в BlogViewSet, которая возвращает все комментарии блога (например, mysite.com/Blog/4/comments)? - person Rani; 19.07.2016
comment
nop, потому что он создает вторую точку входа для той же цели. - person Linovia; 30.07.2016