Гиперссылочные сериализаторы пространства имен в Django REST Framework - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время я занимаюсь обучением по Связям и гиперссылкам API .Однако я столкнулся со странной проблемой, которую не могу решить.Мои serializers.HyperlinkedIdentityField и serializers.HyperlinkedRelatedField, похоже, не обнаруживают пространство имен, которое я использую.

Мои сериализаторы выглядят так:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):

    owner = serializers.ReadOnlyField(source='owner.username')
    highlight = serializers.HyperlinkedIdentityField(view_name='snippets:snippet-highlight', format='html')

    class Meta:
        model = Snippet
        fields = ('url', 'id', 'highlight', 'owner', 'title', 'code', 'linenos', 'language', 'style')


class UserSerializer(serializers.HyperlinkedModelSerializer):

    snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippets:snippet-detail', read_only=True)

    class Meta:
        model = User
        fields = ('url', 'id', 'username', 'snippets')

Что в значительной степени совпадает с руководством, за исключением того, что яя добавляю view_name='snippets:snippet-detail' в поле сериализатора.

Я создаю свое пространство имен в соответствии с документацией Django , добавляя app_name = 'snippets' над моим urlpatterns.

Это ошибка, которую я получаю

Неправильно настроен в / snippets /

Не удалось разрешить URL-адрес для связи с гиперссылкой, используя имя представления «snippet-detail».Возможно, вам не удалось включить связанную модель в ваш API или неправильно настроить атрибут lookup_field в этом поле.

Как вы видите, я подошел к проблеме так же, как другие люди, нобез решения вопроса.У кого-нибудь есть идеи о том, что я мог бы попробовать дальше?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Попробуйте передать lookup_field и lookup_url_kwarg аргументы.

snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippets:snippet-detail',
                                                   lookup_field="",
                                                   lookup_url_kwarg="", read_only=True)

См. HyperlinkedRelatedFieldDoc

0 голосов
/ 14 июня 2019

исправить эту проблему, изменив serializer.py, мы можем определить url, например:

url = serializers.HyperlinkedIdentityField(view_name='snippets:user-detail', lookup_field='pk')

или определить в Meta, например,

extra_kwargs = {
    'url': {'view_name': 'snippet:user-detail', 'lookup_field': 'pk'},
}

весь код serializer.py:

from rest_framework import serializers
from snippets.models import Snippet
from django.contrib.auth.models import User


class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    highlight = serializers.HyperlinkedIdentityField(lookup_field="pk", view_name='snippets:snippet-highlight', format='html')

    class Meta:
        model = Snippet
        fields = ('url', 'id', 'highlight', 'owner', 'title', 'code', 'linenos', 'language', 'style')
        extra_kwargs = {
            'url': {'view_name': 'snippets:snippet-detail', 'lookup_field': 'pk'},
        }


class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = serializers.HyperlinkedRelatedField(lookup_field="pk", many=True, view_name='snippets:snippet-detail', read_only=True)
    url = serializers.HyperlinkedIdentityField(view_name='snippets:user-detail', lookup_field='pk')

    class Meta:
        model = User
        fields = ('url', 'id', 'username', 'snippets')
        # extra_kwargs = {
        #     'url': {'view_name': 'snippet:user-detail', 'lookup_field': 'pk'},
        # }
0 голосов
/ 13 мая 2018

Решил проблему, прочитав еще немного о Гиперссылки и заметив, что я должен добавить extra_kwargs для поля url SnippetSerializer

class Meta:
        model = Snippet
        fields = ('url', 'id', 'highlight', 'owner', 'title', 'code', 'linenos', 'language', 'style')
        extra_kwargs = {
            'url': {'view_name': 'snippets:snippet-detail'},
        }

И UserSerializer

class Meta:
        model = User
        fields = ('url', 'id', 'username', 'snippets')
        extra_kwargs = {
            'url': {'view_name': 'snippets:user-detail'},
        }
...