Как создать другой путь к Django Api Url - PullRequest
0 голосов
/ 31 декабря 2018

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

Я хочу иметь возможность перейти по этому URL-адресу, чтобы получить те же данные - http://127.0.0.1:8000/api/cards/title/Hello

Как мне обновить мои представления и URL-адреса для этого?

базовый URL

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

Я попытался добавить это к карточкам.api.urls.py path('api/cards/title/<str:pk>/', CardDetail.as_view()),, но он по-прежнему ищет переменную id вместо переменной card_title.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

вы можете добавить еще один URL в ваш файл cards.api.urls.py, перенаправив на тот же API для того же ответа.

Добавьте это в свой файл urls.py urlpatterns.

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

Тогда попробуйте нажать http://127.0.0.1:8000/api/cards/title/1

0 голосов
/ 31 декабря 2018

Я думаю, это поможет вам,

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

и создаст новый класс представления, CardTitleDetail, как показано ниже, и добавит атрибут lookup_field

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

urlpatterns = format_suffix_patterns(urlpatterns)

ПРИМЕЧАНИЕ
Атрибут card_title должен быть unique по всей БД,иначе это вызовет исключение !!

...