django - 为什么 Django REST Framework 的 HyperlinkedModelSerializer 不能形成 URL?

标签 django django-rest-framework

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/

相关文章:

javascript - Django,如何强制返回ajax错误?

python - listAPI View 中以十为基数的int()的文字无效 djangorest框架

django rest框架和表单: How to do

django - 无法在 django 的数据库中存储散列密码

Django:在管理员中维护图像的很棒的插件是什么?

python - 创建 zip 存档以供即时下载

javascript - 为什么我们必须对数组进行字符串化而不是对请求的对象进行字符串化?

javascript - 将额外数据附加到表单请求

django - 如何在 Django-Rest-Framework 中使用泛型进行 PUT(部分更新)?

'POST' 数据到 Django 服务器后,Javascript 获取 api 没有得到响应