Я использую 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']
Я должен сделать это для всех объектов (которых я хотел бы избежать).
есть ли способ справиться с этим без использования дополнительного кода? какой-нибудь магический метод / атрибут для вызова / установки?