HyperlinkedModelSerializer по умолчанию не находит конечные точки - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь просто изменить свой ModelSerializer на HyperlinkedModelSerializer, чтобы включить URL-адрес для каждого из объектов, перечисленных в ListView браузера по умолчанию API.

В соответствии с документами, так как я использую по умолчанию 'pk для поиска я просто изменяю класс, от которого унаследован сериализатор:

# class SeasonSerializer(serializers.ModelSerializer):
class SeasonSerializer(serializers.HyperlinkedModelSerializer):

    # url = serializers.HyperlinkedIdentityField(
    #     view_name='season', lookup_field='pk') ---> Not needed according to docs but have also tried with this

    class Meta:
        model = Season
        fields = ('id', 'url', 'years', 'active')

и добавляю контекст при его создании в виде:

class SeasonListView(APIView):

    def get(self, request, *args, **kwargs):
        queryset = Season.objects.all().order_by('years')
        serializer = SeasonSerializer(
            queryset, many=True, context={'request': request})
        print('INFO: ', serializer)
        permission_classes = [ ]
        authentication_classes = [ ]
        return Response({"Seasons": serializer.data})

class SeasonDetailView(APIView):

    def get(self, request, *args, **kwargs):
        pk = kwargs['pk']
        season = get_object_or_404(Season, pk=pk)
        serializer = SeasonSerializer(season, context={'request': request})
        # print('Data: ', serializer.data) --> this breaks
        return Response(serializer.data)

И мои конечные точки То же, что и при использовании ModelSerializer:

urlpatterns = [
    path(r'seasons/', SeasonListView.as_view(), name='season-list'),
    path(r'seasons/<int:pk>/', SeasonDetailView.as_view(), name='season-detail'),
]

Ошибка следующая:

Для http://localhost: 8000 / api / seasons / 1 /

Exception Type: ImproperlyConfigured
Exception Value:    
Could not resolve URL for hyperlinked relationship using view name "season-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

А для http://localhost: 8000 / api / seasons /

Exception Type: ImproperlyConfigured
Exception Value:    
Could not resolve URL for hyperlinked relationship using view name "season-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

Что мне здесь не хватает?

Спасибо!

1 Ответ

0 голосов
/ 10 апреля 2020

По прошествии многих дней я думаю, что нашел проблему, поэтому я пишу здесь на случай, если смогу сэкономить кому-то столько времени!

Проблема в основном заключается в том, как вы обрабатываете ваши маршруты.

if (вы используете Маршрутизатор для каждого приложения): .
Затем вы должны добавить basename объекта при регистрации в маршрутизаторе и вручную определите поле url в сериализаторе. Не забудьте добавить название приложения, например «app: model». Например:

router.register(r'seasons', SeasonViewSet, basename='seasons')
class SeasonSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="accounts:seasons-detail")
    class Meta:
        model = Season
        fields = ('url', 'id', '...')

if (вы используете 1 маршрутизатор для вложения остальных маршрутизаторов из разных приложений):

Как они делают в здесь . Затем вам нужно удалить приложение из определения «app: model» поля url.

Я настоятельно рекомендую использовать django -экстензии для использования python manage.py show_urls, чтобы быть в курсе конечных точек, доступных в вашем проекте.
Благодаря этому я смог выяснить, что происходит вне. Посмотрите на сравнения, когда я добавил свой API root.

(base) ➜  Betcomm git:(master) ✗ docker-compose exec app python manage.py show_urls | grep api/

/api/accounts/profiles/ accounts.views.ProfileViewSet   accounts:profiles-list
/api/accounts/profiles/<pk>/    accounts.views.ProfileViewSet   accounts:profiles-detail
/api/accounts/season-profiles/  accounts.views.SeasonProfileViewSet accounts:season-profiles-list
/api/accounts/season-profiles/<pk>/ accounts.views.SeasonProfileViewSet accounts:season-profiles-detail
/api/accounts/users/    accounts.views.UserViewSet  accounts:users-list
/api/accounts/users/<pk>/   accounts.views.UserViewSet  accounts:users-detail
/api/seasons/seasons/   seasons.views.SeasonViewSet seasons:seasons-list
/api/seasons/seasons/<pk>/  seasons.views.SeasonViewSet seasons:seasons-detail


(base) ➜  Betcomm git:(master) ✗ docker-compose exec app python manage.py show_urls | grep api/

/api/   rest_framework.routers.APIRootView  api-root
/api/\.<format>/    rest_framework.routers.APIRootView  api-root
/api/profiles/  accounts.views.ProfileViewSet   profiles-list
/api/profiles/<pk>/ accounts.views.ProfileViewSet   profiles-detail
/api/profiles/<pk>\.<format>/   accounts.views.ProfileViewSet   profiles-detail
/api/profiles\.<format>/    accounts.views.ProfileViewSet   profiles-list
/api/season-profiles/   accounts.views.SeasonProfileViewSet seasonprofiles-list
/api/season-profiles/<pk>/  accounts.views.SeasonProfileViewSet seasonprofiles-detail
/api/season-profiles/<pk>\.<format>/    accounts.views.SeasonProfileViewSet seasonprofiles-detail
/api/season-profiles\.<format>/ accounts.views.SeasonProfileViewSet seasonprofiles-list
/api/seasons/   seasons.views.SeasonViewSet seasons-list
/api/seasons/<pk>/  seasons.views.SeasonViewSet seasons-detail
/api/seasons/<pk>\.<format>/    seasons.views.SeasonViewSet seasons-detail
/api/seasons\.<format>/ seasons.views.SeasonViewSet seasons-list
/api/users/ accounts.views.UserViewSet  users-list
/api/users/<pk>/    accounts.views.UserViewSet  users-detail
/api/users/<pk>\.<format>/  accounts.views.UserViewSet  users-detail
/api/users\.<format>/   accounts.views.UserViewSet  users-list
...