在django-rest-framework中将HyperLink添加到ModelViewSet

Aar*_*ier 4 python django rest django-rest-framework

是否有可能在Django Rest Framework 中在ModelViewSet 列表视图中的每条记录HyperLinkid字段上添加链接到该记录的详细信息视图

文件说,添加一个view_name说法,但是这是有可能下这样做ModelViewSet,因为看法实际上没有名字呢?

xle*_*eon 10

首先,所有ModelViewSet网址都有名称,即使您没有明确设置这些名称.

您可以在文档中找到如何在路由器中创建默认网址:http://www.django-rest-framework.org/api-guide/routers/(请参阅'SimpleRouter'网址名称表)

要查看应用程序中可用的所有实际URL名称,请尝试使用此实用程序:

def print_url_pattern_names(patterns):
    """Print a list of urlpattern and their names"""
    for pat in patterns:
        if pat.__class__.__name__ == 'RegexURLResolver':            # load patterns from this RegexURLResolver
            print_url_pattern_names(pat.url_patterns)
        elif pat.__class__.__name__ == 'RegexURLPattern':           # load name from this RegexURLPattern
            if pat.name is not None:
                print '[API-URL] {} \t\t\t-> {}'.format(pat.name, pat.regex.pattern)
Run Code Online (Sandbox Code Playgroud)

然后,在你的urls.py中:

urlpatterns = [
    url(r'^', include(router.urls)),
]

if settings.DEBUG:
    print_url_pattern_names(urlpatterns)
Run Code Online (Sandbox Code Playgroud)

如果您希望url与ModelViewSet的名称不同(如我的情况),您可以使用"base_name"在路由器上设置它:

router.register('contents', media_views.MediaViewSet, base_name='contents')
Run Code Online (Sandbox Code Playgroud)

接下来你需要的是扩展HyperlinkedModelSerializer:

from rest_framework import serializers
# in this sample my object is of type "Media"
class MediaSerializer(serializers.HyperlinkedModelSerializer):
    #blablabla
Run Code Online (Sandbox Code Playgroud)

您将准备好序列化程序以显示指向详细信息视图的超链接,但还有一个必需步骤可供使用.这就是"view_name"的用武之地:

from rest_framework import serializers
class MediaSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Media
        fields = ('url', ...[other fields you want to serialize])
        extra_kwargs = {
            'url': {'view_name': 'contents-detail'}
        }
Run Code Online (Sandbox Code Playgroud)
  1. "url"字段是必填字段以显示链接.
  2. 使用'extra_kwargs'> view_name,您告诉框架您的详细信息视图的名称是'content-detail'.
  3. 'content-detail'只是我的视图名称.你需要找到你的(从上面的网址名称实用程序)

这是样本的http响应(参见url字段):

在此输入图像描述