В Django REST Framework, как фильтровать список по пользователю? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть две модели, Пользователь и Книга. Пользователи владеют книгами и могут быть просмотрены только их владельцами.

ПРИМЕЧАНИЕ: модель книги обрабатывается в отдельной базе данных, поэтому я не могу использовать внешний ключ в книге, указывающей на пользователя. Не уверен, что это имеет значение.

Если я аутентифицирован и отправляю запрос GET /books, я хочу, чтобы отображались только книги, принадлежащие пользователю. Если я не аутентифицирован, я должен получить ошибку 403.

Где я должен реализовать эту логику c?

Я мог бы сделать это в представлении, с чем-то вроде этого:

class BookView(APIView):
    """
    Get books
    """
    permission_classes = (IsAuthenticated, IsBookOwner,)
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    def post(self, request):
        # create a book

    def get(self, request):
        books = Book.objects.filter(owner_id=request.user.owner_id)
        serializer = self.serializer_class(books, many=True)
        return Response(serializer.data)
class IsBookOwner(permissions.BasePermission):
    """
    Object-level permission to only allow seeing his own books
    """

    def has_object_permission(self, request, view, obj):

        # obj here is a Book instance
        return obj.owner_id == request.user.owner_id

Это правильный способ сделать это? Кроме того, разрешение IsBookOwner что-то здесь делает?

1 Ответ

1 голос
/ 13 апреля 2020

Модель пользователя не имеет поля owner_id. Вы должны изменить request.user.owner_id на request.user.id

Для получения запроса вам не нужно разрешение IsBookOwner. Вы уже проверили владельца в своем наборе запросов. если вам нужно проверить весь вид владельца книги, это нормально.

books = Book.objects.filter(owner_id=request.user.owner_id)
...