首页 > 解决方案 > API url 路由 - Django/Postman

问题描述

我正在搞乱后端 Django API 教程(Django 2.1),并且无法通过 Postman 提取“个人资料”信息。我的假设是我在 urls.py 中没有正确地说明我的 url。

这是我的项目 urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('conduit.apps.authentication.urls'), name='authentication'),
    path('api/v1/', include('conduit.apps.profiles.urls'), name='profiles')
]

这是我的profiles.urls.py:

from .views import ProfileRetrieveAPIView

urlpatterns = [
    path('profiles/<username:username>/', ProfileRetrieveAPIView.as_view())
]

我认为我的问题与我如何实施 / 到我的道路尽头有关。我对这种机制的唯一其他相关经验是在以前的项目中,我使用类似这样的东西来进行独特的博客文章 url 路由(我已经成功完成了):

".../<slug:slug>/"

现在,这是我对上述 url 的基于类的相关视图:

class ProfileRetrieveAPIView(RetrieveAPIView):
permission_classes = (AllowAny,)
renderer_classes = (ProfileJSONRenderer,)
serializer_class = ProfileSerializer

def retrieve(self, request, username, *args, **kwargs):
    try:
        profile = Profile.objects.select_related('user').get(
            user__username=username
        )
    except Profile.DoesNotExist:
        raise ProfileDoesNotExist

    serializer = self.serializer_class(profile)

    return Response(serializer.data, status=status.HTTP_200_OK)

您可以在我的检索功能中看到,我正在使用用户名属性。这就是我认为我正在尝试与我的 url 路径匹配的内容。我猜我可能不理解如何正确地将 url 路径变量(该术语听起来不正确)与我的观点相关联。谢谢!

另外 - 我正在遵循的教程是让我在邮递员中发出 GET 请求。我作为教程的一部分下载的集合默认填充了以下 url:

http://127.0.0.1:8000/api/v1/profiles/celeb_harry

我的用户名('harry')前面的'celeb_'来自哪里。我在我的任何 .py 文件(渲染器、序列化器、视图、url 等)中都没有看到它

标签: djangourldjango-rest-framework

解决方案


您需要lookup_field在您的视图中设置。例如:

class ProfileRetrieveAPIView(RetrieveAPIView):
    lookup_field = 'username'

 path('profiles/<username>/', ProfileRetrieveAPIView.as_view())

发生的情况是,get_object在视图的内部方法中,基于lookup_fieldaget_object_or_404被执行。请参阅此处的实现以了解RetrieveAPIView的工作原理。


推荐阅读