Как заставить drf HyperlinkedModelSerializer элегантно работать с app_name? - PullRequest
0 голосов
/ 10 ноября 2019

Я использую drf в проекте django

# project/urls.py
from django.urls import include, path

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

в отдельном приложении, которое я именую через имя_приложения следующим образом:

# api/urls.py
from django.urls import include, path
from rest_framework import routers
from . import views

app_name = 'drf'

router = routers.SimpleRouter()
router.register('segments', views.SegmentViewSet)

urlpatterns = [
    path('', include(router.urls)),
]
# api/serializers.py
from rest_framework import serializers
from segment.models import Segment

class SegmentSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Segment
        fields = ['id', 'url', 'name']
# api/views.py
from rest_framework import viewsets
from .serializers import SegmentSerializer
from segment.models import Segment

class SegmentViewSet(viewsets.ModelViewSet):
    queryset = Segment.objects.all()
    serializer_class = SegmentSerializer

вызов конечной точки / drf / сегментов / приводит к следующей ошибке:

ImproperlyConfigured at /drf/segments/
Could not resolve URL for hyperlinked relationship using view name "segment-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

Request Method: GET
Request URL: http://localhost:8000/drf/segments/
Django Version: 2.2.7
Python Executable: /Users/udos/.virtualenvs/ts/bin/python
Python Version: 3.6.4
.
.
.

, чтобы «исправить» это, у меня естьчтобы добавить следующий код в сериализатор:

url = serializers.HyperlinkedIdentityField(
    view_name='drf:segment-detail',
)

, в результате чего:

# api/serializers.py
from rest_framework import serializers
from segment.models import Segment

class SegmentSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        view_name='drf:segment-detail',
    )

    class Meta:
        model = Segment
        fields = ['id', 'url', 'name']

Я должен сделать это для всех объектов (которых я хотел бы избежать).

есть ли способ справиться с этим без использования дополнительного кода? какой-нибудь магический метод / атрибут для вызова / установки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...