DRF 的新手,只要我不在字段中包含“url”,一切正常。这是我得到的:
序列化器:
class TaskSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Task
fields = ('pk', 'short_desc', 'scheduled_date')
查看集:
class TaskViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Task.objects.all().order_by('scheduled_date')
serializer_class = TaskSerializer
网址:
router = routers.DefaultRouter()
router.register(r'tasks', views.TaskViewSet)
urlpatterns = [
[... bunch of non-REST URLs]
# REST API
url(r'^', include(router.urls)),
在运行时,打印 router.urls 给我:
<RegexURLPattern api-root ^$>
<RegexURLPattern api-root ^\.(?P<format>[a-z0-9]+)/?$>
<RegexURLPattern task-list ^tasks/$>
<RegexURLPattern task-list ^tasks\.(?P<format>[a-z0-9]+)/?$>
<RegexURLPattern task-detail ^tasks/(?P<pk>[^/.]+)/$>
<RegexURLPattern task-detail ^tasks/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>
如果我在浏览器中键入 [...]/tasks/
和 [...]/tasks/123/
,它们都可以工作,这导致我相信 task-list 和 task-detail View 确实存在。
现在我通过向序列化程序添加“url”来引入一个问题:
class TaskSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Task
fields = ('url', 'pk', 'short_desc', 'scheduled_date')
将“url”添加到字段后,我收到以下错误:
Could not resolve URL for hyperlinked relationship using view name "task-detail". You may have failed to include the related model in your API, or incorrectly configured the
lookup_field
attribute on this field.
DRF 文档说:
There needs to be a way of determining which views should be used for hyperlinking to model instances. By default hyperlinks are expected to correspond to a view name that matches the style '{model_name}-detail', and looks up the instance by a pk keyword argument.
由于我已经验证了 task-detail 存在并且相应的 URL [...]/tasks/123/
有效,我终生无法弄清楚为什么 DRF无法形成 URL。有什么想法吗?
最佳答案
受 Kunkka 的回答所揭示的线索启发,我有一个如下所示的解决方案:
class TaskSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="task:task-detail")
class Meta:
model = Task
fields = ('url', 'pk', 'short_desc', 'scheduled_date')
即我在我最初在我的问题中发布的序列化程序中添加了一个 url = [...]
行。这解决了可能是由于 DRF 不知道 'task-detail' 实际上是在 'task' 命名空间中引起的查找问题。
有更好的解决方案吗?
关于django - 为什么 Django REST Framework 的 HyperlinkedModelSerializer 不能形成 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201520/