Django REST Framework JSON API:使用ResourceRelatedField时无法解析超链接关系的URL
我正在编写一个HTTP API,它使用django+django REST framework+django REST framework JSON API。当我尝试执行修补程序请求时,我收到了此错误 类型不正确。预期的URL字符串,已收到OrderedDict 更新关系时。查看我理解的问题,我需要使用ResourceRelatedField 我试图在这里遵循文档。下面是我的代码的样子 url.pyDjango REST Framework JSON API:使用ResourceRelatedField时无法解析超链接关系的URL,django,api,django-rest-framework,json-api,Django,Api,Django Rest Framework,Json Api,我正在编写一个HTTP API,它使用django+django REST framework+django REST framework JSON API。当我尝试执行修补程序请求时,我收到了此错误 类型不正确。预期的URL字符串,已收到OrderedDict 更新关系时。查看我理解的问题,我需要使用ResourceRelatedField 我试图在这里遵循文档。下面是我的代码的样子 url.py from django.conf import settings from django.con
from django.conf import settings
from django.conf.urls import include, url
from rest_framework import routers
from events import views as e_views
router = routers.DefaultRouter()
router.register(r'events', e_views.EventViewSet)
router.register(r'event-types', e_views.EventTypeViewSet)
urlpatterns = [
url(r'^', include('events.urls')),
url(r'^', include(router.urls)),
]
事件/url.py
from django.conf.urls import url
from .views import EventRelationshipView
urlpatterns = [
url(
regex=r'^events/(?P<event_pk>[^/.]+)/relationships/(?P<related_field>[^/.]+)$',
view=EventRelationshipView.as_view(),
name='event-relationships'
)
]
序列化程序.py
from .models import Event, EventType
from rest_framework_json_api import serializers
from rest_framework_json_api.relations import ResourceRelatedField
class EventTypeSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = EventType
fields = ('url', 'id', 'title')
class EventSerializer(serializers.HyperlinkedModelSerializer):
included_serializers = {'event_type': EventTypeSerializer}
# THIS PART HERE DOESN'T WORK
event_type = ResourceRelatedField(
queryset=EventType.objects,
related_link_view_name='eventtype-detail',
related_link_url_kwarg='pk',
self_link_view_name='event-relationships'
)
class Meta:
model = Event
fields = ('url', 'id', 'timestamp', 'delay', 'event_type', 'name', 'location',
'coordinates', 'depth', 'size', 'comments', 'is_virtual', 'is_visible')
class JSONAPIMeta:
included_resources = ['event_type']
views.py
# -*- coding: utf-8 -*-
import logging
from rest_framework import viewsets
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework_json_api.parsers import JSONParser
from rest_framework_json_api.renderers import JSONRenderer
from rest_framework_json_api.views import RelationshipView
import django_filters
from .models import Event, EventType
from .serializers import EventSerializer, EventTypeSerializer
class EventFilter(django_filters.rest_framework.FilterSet):
start_timestamp = django_filters.DateTimeFilter(name="timestamp", lookup_expr='gte')
end_timestamp = django_filters.DateTimeFilter(name="timestamp", lookup_expr='lte')
class Meta:
model = Event
fields = ['event_type', 'start_timestamp', 'end_timestamp']
class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
parser_classes = (JSONParser,)
renderer_classes = (JSONRenderer,)
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filter_class = EventFilter
search_fields = ('name', 'location', 'comments')
ordering_fields = '__all__'
class EventTypeViewSet(viewsets.ModelViewSet):
queryset = EventType.objects.all()
serializer_class = EventTypeSerializer
parser_classes = (JSONParser,)
renderer_classes = (JSONRenderer,)
class EventRelationshipView(RelationshipView):
queryset = Event.objects
class EventTypeRelationshipView(RelationshipView):
queryset = EventType.objects
错误
在url参数中将
event\u pk
重命名为pk
解决了问题。你能试试self\u link\u view\u name='your\u app:event relations'@ABDULNIYASPM仍然不行,没有帮助。
# -*- coding: utf-8 -*-
import logging
from rest_framework import viewsets
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework_json_api.parsers import JSONParser
from rest_framework_json_api.renderers import JSONRenderer
from rest_framework_json_api.views import RelationshipView
import django_filters
from .models import Event, EventType
from .serializers import EventSerializer, EventTypeSerializer
class EventFilter(django_filters.rest_framework.FilterSet):
start_timestamp = django_filters.DateTimeFilter(name="timestamp", lookup_expr='gte')
end_timestamp = django_filters.DateTimeFilter(name="timestamp", lookup_expr='lte')
class Meta:
model = Event
fields = ['event_type', 'start_timestamp', 'end_timestamp']
class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
parser_classes = (JSONParser,)
renderer_classes = (JSONRenderer,)
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filter_class = EventFilter
search_fields = ('name', 'location', 'comments')
ordering_fields = '__all__'
class EventTypeViewSet(viewsets.ModelViewSet):
queryset = EventType.objects.all()
serializer_class = EventTypeSerializer
parser_classes = (JSONParser,)
renderer_classes = (JSONRenderer,)
class EventRelationshipView(RelationshipView):
queryset = Event.objects
class EventTypeRelationshipView(RelationshipView):
queryset = EventType.objects
[08/Feb/2017 15:07:44] ERROR [django.request:124] Internal Server Error: /events/6/
Traceback (most recent call last):
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 217, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 215, in _get_response
response = response.render()
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/django/template/response.py", line 109, in render
self.content = self.rendered_content
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/rest_framework/response.py", line 72, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/rest_framework_json_api/renderers.py", line 480, in render
json_api_data = self.build_json_resource_obj(fields, serializer_data, resource_instance, resource_name)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/rest_framework_json_api/renderers.py", line 390, in build_json_resource_obj
relationships = cls.extract_relationships(fields, resource, resource_instance)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/rest_framework_json_api/renderers.py", line 129, in extract_relationships
field_links = field.get_links(resource_instance)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/rest_framework_json_api/relations.py", line 106, in get_links
self_link = self.get_url('self', self.self_link_view_name, self_kwargs, request)
File "/home/nargiza/virtualenvs/myenv/local/lib/python2.7/site-packages/rest_framework_json_api/relations.py", line 90, in get_url
raise ImproperlyConfigured(msg % view_name)
ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "event-relationships".