【问题标题】:API url routing - Django/PostmanAPI url 路由 - Django/Postman
【发布时间】:2019-04-27 14:36:30
【问题描述】:

我正在处理后端 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 请求。我作为教程的一部分下载的集合默认填充了以下网址:

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

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

【问题讨论】:

    标签: django url django-rest-framework


    【解决方案1】:

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

    class ProfileRetrieveAPIView(RetrieveAPIView):
        lookup_field = 'username'
    
     path('profiles/<username>/', ProfileRetrieveAPIView.as_view())
    

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

    【讨论】:

    • 添加该查找字段不走运。当我尝试通过 Postman 发出 GET 请求时,我现在看到以下错误:'ImproperlyConfigured: URL route 'profiles//' uses invalid converter 'username'。 'username' 是保留关键字吗?
    • 是否需要重新定义 get_object 函数并完全返回一个新的 obj 而不是只设置 lookup_field 变量?
    • 没有名为username 的转换器,所以&lt;username:username&gt; 将不起作用。所以要么使用&lt;username&gt; 要么使用&lt;str:username&gt;
    • 这就是我想要的。非常感谢!
    • 对不起,我以为我做到了。
    猜你喜欢
    • 2021-07-24
    • 2019-09-20
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多