【问题标题】:How to make a different Django Api Url path如何制作不同的 Django Api Url 路径
【发布时间】:2019-05-27 17:04:48
【问题描述】:

Django 2.1、python 3.6、djangorestframework。

当我转到以下 url 时,我可以看到我的数据(太棒了!)http://127.0.0.1:8000/api/cards/1 这是我在 api 页面上看到的 -

HTTP 200 OK
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": "1",
        "card_title": "Hello"
    },
]

我希望能够访问此网址以获取相同的数据 - http://127.0.0.1:8000/api/cards/title/Hello

如何更新我的视图和网址来做到这一点?

基本网址

urlpatterns = [
    ...
    path('api/cards/', include('cards.api.urls')),
]

cards.api.urls.py

urlpatterns = [
    path('', CardListView.as_view()),
    path('<str:pk>/', CardDetailView.as_view()),
]

urlpatterns = format_suffix_patterns(urlpatterns)

cards.api.views.py

class CardList(generics.ListCreateAPIView):
    permission_classes = ()

    queryset = Card.objects.all()
    serializer_class = CardSerializer


class CardDetail(generics.RetrieveUpdateDestroyAPIView):
    #permisssion_classes = (UserPermission,) # set the permission class
    permission_classes = ()

    queryset = Card.objects.all()
    serializer_class = CardSerializer

我尝试将其添加到 cards.api.urls.py path('api/cards/title/&lt;str:pk&gt;/', CardDetail.as_view()), ,但它仍在查看 id 变量而不是 card_title 变量。

【问题讨论】:

  • 你能不能再试一次,把path改成url,比如url('api/cards/title/&lt;str:pk&gt;/'。从from django.conf.urls import url导入这个?
  • @Micah " 它仍然在查看 id 变量而不是 card_title 变量" 你的意思是什么?你说过/api/cards/title/1 api 是新的..对吗?
  • 我犯了一个错误,问错了问题。我想打api/cards/title/hello 而不是api//cards/title/1

标签: django-rest-framework django-urls django-2.0


【解决方案1】:

我想这会对你有所帮助,

# base urls.py
urlpatterns = [
    ...
    path('api/', include('cards.api.urls')), # remove "cards/" from url
]

和 创建一个新的视图类,CardTitleDetail如下并添加lookup_field属性

class CardTitleDetail(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'card_title'
    permission_classes = ()
    queryset = Card.objects.all()
    serializer_class = CardSerializer
# cards.api.urls.py
urlpatterns = [
    path('cards/', CardListView.as_view()),  # add "cards/" to the url
    path('cards/&ltstr:pk>/', CardDetailView.as_view()),  # add "cards/" to the url
    path('cards/title/&ltstr:card_title>/', CardTitleDetail.as_view()),  # this is the new url
]

urlpatterns = format_suffix_patterns(urlpatterns)

注意
card_title 属性在数据库中应该是 unique,否则会引发异常!!

【讨论】:

  • 你说的很对,但是我问错了问题。我想打/api/cards/title/hello 而不是/api/cards/title/1
  • @MicahPearce 更新了答案 :) 希望它能解决问题 :)
【解决方案2】:

您可以在您的 cards.api.urls.py 文件中添加另一个 url 重定向到相同的 api 以获得相同的响应。

将此添加到您的 urls.py 文件 urlpatterns。

path('title/<str:pk>/', CardDetailView.as_view()),

然后尝试点击这个http://127.0.0.1:8000/api/cards/title/1

【讨论】:

  • 你说的很对,但是我问错了问题。我想打/api/cards/title/hello 而不是/api/cards/title/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2020-07-12
  • 2011-08-26
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多