【问题标题】:Django Rest Framework with either a slug or a pk lookup field for the DetailAPIView带有用于 DetailAPIView 的 slug 或 pk 查找字段的 Django Rest Framework
【发布时间】:2018-04-01 12:15:49
【问题描述】:

我有一个 Django Rest Framework 的 api 帖子列表。知道 我 slugify 我的帖子标题,每当用户为她的帖子提供标题时,我想在没有 slug 对象时使用 pk(DRF 中的默认查找字段)捕获帖子 api 详细信息提供,或者如果帖子有标题,则使用 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'

并提供了相应的urls.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'),
]

当帖子具有 slugified(标题)查找时,这种方法非常有效。但是没有 slug 的帖子的帖子详细视图显示如下:

HTTP 404 Not Found
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
  "detail": "Not found."
}

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    首先:您的 urls.py 与 第一个匹配的 url一起使用。所以它找不到你的第二个网址。

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

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

    【讨论】:

    • 是的,我在想也许无论如何我都应该构建 slug(生成一个 slug,无论用户是否为她的帖子提供标题)。我想我会为我的随机 slug 生成器函数重做逻辑,并一劳永逸地修复 slug 的查找字段。干杯伙伴。
    • 很高兴这对您有所帮助。考虑用户需要的帖子标题怎么样?我不确定你在建造什么,但这对我来说听起来很合理。
    • 嘿Chgad。我正在寻找一个 instagram 克隆。 Instagram 帖子没有必需的标题。所以我坚持也许我也会这样做。
    • 如果我的回答对您有所帮助,并且您认为它是一种解决方案,您会这么好心并将其标记为解决方案吗?
    • 完成。让我们保持联系,我的项目会有很多问题。
    【解决方案2】:

    对我来说,对单个视图使用两个不同的参数似乎是一种不好的做法,我建议您使用其中一个,在您看来,您可以尝试/捕获,因为 pk 将是整数类型,而标题将是字符串类型,你可以检查 url 参数的类型然后做你的逻辑

    【讨论】:

    • 您能否详细说明一下。看来您的建议与我已经做过的相对应。谢谢。
    • 你有两个 url 模式,我建议你只使用一个 url 模式并在视图中尝试捕获以检查 url 的参数。因为 pk 是 int 类型而 slug 将是字符串。您可以使用类型来确定传递了什么
    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2019-07-03
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多