Python Django Rest框架,具有用于DetailAPIView的slug或pk查找字段

Python Django Rest框架,具有用于DetailAPIView的slug或pk查找字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个带有Django Rest框架的帖子api列表。我知道我将我的文章标题slugify,每当用户为她的文章提供标题时,我都希望在没有提供slug对象时,使用DRF中的默认查找字段pk捕获postapi细节,或者在文章有标题时使用slug字段 在post应用程序的api文件夹中,我编写了以下views.py: class PostDetailAPIView(generics.RetrieveAPIView): queryset = Post.objects.all() seria

我有一个带有Django Rest框架的帖子api列表。我知道我将我的文章标题slugify,每当用户为她的文章提供标题时,我都希望在没有提供slug对象时,使用DRF中的默认查找字段pk捕获postapi细节,或者在文章有标题时使用slug字段

在post应用程序的api文件夹中,我编写了以下views.py:

class PostDetailAPIView(generics.RetrieveAPIView):
   queryset = Post.objects.all()
   serializer_class = serializers.PostDetailSerializer
   try:
      lookup_field = 'slug'
   except:
      lookup_field = 'pk'
并提供了相应的URL.py:

urlpatterns = [
   url(r'^$', PostListAPIView.as_view(), name='list-api'),
   url(r'^(?P<slug>[\w-]+)/$', PostDetailAPIView.as_view(), 
       name='detail-api'),
   url(r'^(?P<pk>\d+)/$', PostDetailAPIView.as_view(), name='detail-
       api'),
]

关于如何显示pk或slug字段查找的post api详细信息,有什么建议吗?最好在URL.py中没有代码重复。

在单个视图中使用两个不同的参数对我来说似乎是一种不好的做法,我建议您使用其中一个参数,在您的视图中,您可以尝试/捕获,因为pk将是整数类型,而标题将是字符串类型,您可以检查url参数的类型,然后首先执行逻辑:您的url.py与第一个匹配的url一起工作。所以它找不到你的第二个url

第二:在我看来,您应该坚持使用pk版本(即REST状态)或slug版本进行查找。所以一般来说,我会预测寻找pk或slug的过程


我知道这还不能解决100%的问题,但它可以让您忽略正在发生的事情以及REST端点可能是什么样子。

请详细说明。看来你的建议和我已经做的是一致的。谢谢。您有两个url模式,我建议您只使用一个url模式,并在视图中进行尝试捕获以检查url的参数。因为pk是int类型,slug将是string。您可以使用类型来确定传递了什么是的,我在想也许我应该构建slug,不管生成slug的是什么,无论用户是否为她的帖子提供标题。我想我将重做随机段塞生成器函数的逻辑,并一次性修复段塞的查找字段。干杯,伙计。我很高兴这对你有帮助。按照用户的要求考虑一个帖子标题怎么样?我不知道你在建什么,但这听起来对我来说是合理的。嘿,奇加德。我正在复制instagram。Instagram帖子没有必要的标题。所以我想也许我也会这样做。如果我的回答帮助了你,你认为这是一个解决方案,你会这么善良并把它标记为解决方案吗?让我们保持联系,我将有我的项目很多问题。
HTTP 404 Not Found
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
  "detail": "Not found."
}