第一件事是所有 ModelViewSet url 都有名称,即使您没有明确设置这些名称。
您可以在文档中了解如何在路由器中创建默认 url:http://www.django-rest-framework.org/api-guide/routers/(请参阅“SimpleRouter”url 名称表)
要查看应用程序中所有可用的实际 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)
然后,在你的 urls.py 中:
urlpatterns = [
url(r'^', include(router.urls)),
]
if settings.DEBUG:
print_url_pattern_names(urlpatterns)
如果您希望 url 与您的 ModelViewSet 的名称不同(如我的情况),您可以使用“base_name”在路由器上设置它:
router.register('contents', media_views.MediaViewSet, base_name='contents')
接下来您需要扩展 HyperlinkedModelSerializer:
from rest_framework import serializers
# in this sample my object is of type "Media"
class MediaSerializer(serializers.HyperlinkedModelSerializer):
#blablabla
您将准备好一个序列化程序来显示指向您的详细视图的超链接,但是还需要一个必要的步骤才能使其正常工作。这就是“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'}
}
- “url”字段是显示链接的必填字段。
- 使用 'extra_kwargs' > view_name 你告诉框架你的细节视图的名字是'content-detail'。
- 'content-detail' 只是我的视图名称。你
需要找出你的(从上面的 url names 实用程序)
这是来自示例的 http 响应(请参阅 url 字段):