首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Django REST框架的HyperlinkedModelSerializer表单URL不能呢?

为什么Django REST框架的HyperlinkedModelSerializer表单URL不能呢?
EN

Stack Overflow用户
提问于 2015-10-18 18:15:30
回答 2查看 2.8K关注 0票数 3

新的DRF和一切工作,只要我不包括'url‘在字段。我要说的是:

序列化器:

代码语言:javascript
复制
class TaskSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Task
        fields = ('pk', 'short_desc', 'scheduled_date')

视图集:

代码语言:javascript
复制
class TaskViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Task.objects.all().order_by('scheduled_date')
    serializer_class = TaskSerializer

网址:

代码语言:javascript
复制
router = routers.DefaultRouter()
router.register(r'tasks', views.TaskViewSet)

urlpatterns = [

    [... bunch of non-REST URLs]

    # REST API
    url(r'^', include(router.urls)),

在运行时,打印router.urls给我:

代码语言:javascript
复制
<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/都可以工作,这使我相信任务列表和任务细节视图确实存在。

现在,我通过在序列化程序中添加“url”来介绍一个问题:

代码语言:javascript
复制
class TaskSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Task
        fields = ('url', 'pk', 'short_desc', 'scheduled_date')

在将“url”添加到字段后,我得到以下错误:

无法使用视图名称“任务详细信息”解析超链接关系的URL。您可能没有在API中包含相关的模型,或者在这个字段上错误地配置了lookup_field属性。

DRF的医生说:

需要有一种方法来确定应该使用哪些视图来超链接到模型实例。默认情况下,超链接应该对应与样式“{model_name}-detail”匹配的视图名称,并通过pk关键字参数查找实例。

由于我已经验证了任务细节的存在和相应的[...]/tasks/123/的工作,我无法在我的生活中找出为什么DRF不能形成URL。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 08:44:24

在昆卡的答案所揭示的线索的启发下,我有一个解决方案,看起来是这样的:

代码语言:javascript
复制
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不知道“任务-细节”实际上在“任务”命名空间中而引起的。

有更好的解决办法吗?

票数 7
EN

Stack Overflow用户

发布于 2015-10-19 05:47:15

你能试试这个吗?

代码语言:javascript
复制
class TaskSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.SerializerMethodField()
    class Meta:
        model = Task
        fields = ('pk','url', 'short_desc', 'scheduled_date')

    def get_url(self,obj):
        request = self.context['request']
        return = {'self':reverse('task-detail',kwargs={'pk':obj.pk},request=request)}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33201520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档