DjangoRestFramework - 当 `get_queryset()` 由于对象不存在而无法获取对象时,我在哪里引发 404 错误?

use*_*875 5 django-rest-framework

这是我的观点:

class PostListByUsername(generics.ListAPIView):
    serializer_class = PostSerializer
    permission_classes = (IsAuthenticated, IsLikeOrOwnerDeleteOrReadOnly, IsFromSameLocation,)

    def get_queryset(self):
        username = self.kwargs['username']
        user = User.objects.get(username=username)
        return Post.objects.filter(owner__username=username).order_by('-createdAt')
Run Code Online (Sandbox Code Playgroud)

这是我的IsFromSameLocation许可:

class IsFromSameLocation(permissions.BasePermission):
    """
    Permission.
    Allow permissions to authenticated users from the same
    location as the user.
    """
    message = 'Not from the same location.'

    def has_permission(self, request, view):
        username = view.kwargs.get('username', None)
        try:
            userProfile = User.objects.get(username=username)
        except:
            return False

        return request.user.userextended.location == userProfile.userextended.location
Run Code Online (Sandbox Code Playgroud)

话虽如此,在我的get_queryset()方法中,我这样做user = User.objects.get(username=username),但如果用户不存在,我想引发 404 错误。我知道get_queryset()应该返回一个查询集,所以我猜我不应该在该方法中引发 404。那么我到底应该在哪里检查用户是否存在呢?请注意,在我的许可下,我确实进行了尝试和例外来查看用户是否存在,但根据我的理解,权限应该只返回 True 或 False (不会引发 404 错误)。

Iva*_*van 5

实际上,您可以从权限引发异常,Django 将正确处理它。例如,您可以使用get_object_or_404()快捷功能来做到这一点:

def has_permission(self, request, view):
    username = view.kwargs.get('username', None)
    userProfile = get_object_or_404(User, username=username)
    return request.user.userextended.location == userProfile.userextended.location
Run Code Online (Sandbox Code Playgroud)

事实上,虽然抛出异常的代码是在视图中执行的,但它将由 Django 处理,因此从视图、序列化器、权限、模型等方法中引发异常并不重要。