django - 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 等)中都没有看到它
解决方案
您需要lookup_field
在您的视图中设置。例如:
class ProfileRetrieveAPIView(RetrieveAPIView):
lookup_field = 'username'
path('profiles/<username>/', ProfileRetrieveAPIView.as_view())
发生的情况是,get_object
在视图的内部方法中,基于lookup_field
aget_object_or_404
被执行。请参阅此处的实现以了解RetrieveAPIView的工作原理。
推荐阅读
- angular - 拦截器不添加标头来获取请求
- android - 无法从外部存储中获取音频
- java - 无论如何将十六进制字符串值转换为长字符串?
- ruby-on-rails - 模型在拖动时未正确更新(公寓 + Vue + Rails 6)
- ios - 使用可扩展的 tableview 单元格和 dequeueReusableCells
- javascript - 访问不同 Vue 组件的返回值 ("1= X, 2=Y, 3=XY")
- mysql - 将 NULL 值替换为连接结果中的值
- laravel - 在 Laravel API 资源中隐藏属性
- swiftui - SwiftUI 上下文菜单是否使用 LayoutConstraints?
- python - 确定 tkinter UI 类属性是否已从外部模块更改的最佳方法是什么?