Django-REST:通过用户名而不是主键来获取用户

Alt*_*yyr 3 python django-rest-framework

我正在使用从ModelViewSet派生的基本UserViewSet。
通过主键检索用户api/users/<pk>工作正常。
但我也希望能够通过用户名检索用户。

我添加了一条新的详细路线,但是404当我尝试使用url获取用户时,我总是会进入服务器/api/users/retrieve_by_username/altoyr

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @detail_route(methods=['get'])
    def retrieve_by_username(self, request, username=None):
        try:
            user = User.objects.get(userName=username)
            return Response(user)
        except User.DoesNotExist:
            return Response("No user with username found!", status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

Urls通过路由器注册:

router = DefaultRouter()
router.register(r'users', views.UserViewSet)

# The API URLs are now determined automatically by the router.
# Additionally, we include the login URLs for the browsable API.
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
Run Code Online (Sandbox Code Playgroud)

我想我缺少构建剩余网址的重要部分。

Anu*_*dra 5

您可以通过添加以下列表路由来做到这一点:

@list_route(methods=['get'], url_path='retrieve_by_username/(?P<username>\w+)')
def getByUsername(self, request, username ):
    user = get_object_or_404(User, username=username)
    return Response(UserSerializer(user).data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

网址将类似于:

/api/users/retrieve_by_username/altoyr
Run Code Online (Sandbox Code Playgroud)

  • 在阅读了一些有关REST-Url的信息后,这看起来不错,我认为该Url应该看起来像`/ api / users / username / altoyr`。我在家时会尝试您的方法。 (2认同)