代码之家  ›  专栏  ›  技术社区  ›  Micah Pearce

如何创建不同的Django Api Url路径

  •  0
  • Micah Pearce  · 技术社区  · 6 年前

    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"
        },
    ]
    

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

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

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

    cards.api.url.py

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

    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
    

    path('api/cards/title/<str:pk>/', CardDetail.as_view()), ,但它仍在关注 id 变量而不是 card_title 变量

    2 回复  |  直到 6 年前
        1
  •  2
  •   JPG    6 年前

    我想这会对你有帮助,

    # 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

        2
  •  0
  •   Community kfsone    4 年前

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

    将其添加到URL.py文件urlpatterns中。

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

    然后试试打这个 http://127.0.0.1:8000/api/cards/title/1