URL-маршрутизация API - Джанго / Почтальон - PullRequest
0 голосов
/ 26 ноября 2018

Я возлюсь с бэкэндом по обучению API Django (Django 2.1), и у меня возникают проблемы с извлечением информации из профиля через Почтальон.Я предполагаю, что я не правильно указываю свой URL в своем urls.py.

Вот мой проект urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('conduit.apps.authentication.urls'), name='authentication'),
    path('api/v1/', include('conduit.apps.profiles.urls'), name='profiles')
]

Вот мой profiles.urls.py:

from .views import ProfileRetrieveAPIView

urlpatterns = [
    path('profiles/<username:username>/', ProfileRetrieveAPIView.as_view())
]

Я думаю, что моя проблема связана с тем, какЯ реализую / до конца моего пути.Мой единственный другой соответствующий опыт работы с этим механизмом был в предыдущих проектах, где я использовал что-то подобное для уникальной маршрутизации URL-адреса в блоге (что я успешно сделал):

".../<slug:slug>/"

Теперь вот мой соответствующийПредставление на основе класса для указанного выше URL:

class ProfileRetrieveAPIView(RetrieveAPIView):
permission_classes = (AllowAny,)
renderer_classes = (ProfileJSONRenderer,)
serializer_class = ProfileSerializer

def retrieve(self, request, username, *args, **kwargs):
    try:
        profile = Profile.objects.select_related('user').get(
            user__username=username
        )
    except Profile.DoesNotExist:
        raise ProfileDoesNotExist

    serializer = self.serializer_class(profile)

    return Response(serializer.data, status=status.HTTP_200_OK)

Вы можете видеть в моей функции получения, я работаю с атрибутом имени пользователя.Это то, что я думаю, что я пытаюсь соответствовать моему пути URL.Я предполагаю, что я, вероятно, не понимаю, как правильно связать переменную пути URL (эта терминология звучит неправильно) с моим представлением.Спасибо!

Также - учебник, которому я следую, заставляет меня сделать запрос GET в почтальоне.Коллекция, которую я скачал как часть учебника, по умолчанию имеет следующий URL:

http://127.0.0.1:8000/api/v1/profiles/celeb_harry

Откуда берется префикс «celeb_» перед моим именем пользователя («harry»).Я не вижу этого ни в одном из моих файлов .py (средства визуализации, сериализаторы, представления, URL-адреса и т. Д.)

1 Ответ

0 голосов
/ 26 ноября 2018

Вам необходимо установить lookup_field в вашем представлении.Например:

class ProfileRetrieveAPIView(RetrieveAPIView):
    lookup_field = 'username'

 path('profiles/<username>/', ProfileRetrieveAPIView.as_view())

Что происходит, когда внутри get_object метода представления, основанного на lookup_field, выполняется get_object_or_404.Пожалуйста, ознакомьтесь с реализацией в здесь для понимания того, как RetrieveAPIView работает.

...