У меня есть две модели, Пользователь и Книга. Пользователи владеют книгами и могут быть просмотрены только их владельцами.
ПРИМЕЧАНИЕ: модель книги обрабатывается в отдельной базе данных, поэтому я не могу использовать внешний ключ в книге, указывающей на пользователя. Не уверен, что это имеет значение.
Если я аутентифицирован и отправляю запрос 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 что-то здесь делает?