在 Django Rest Framework 中是否可以在链接到的 ModelViewSet List View 中的每条记录的 id
字段上添加一个 HyperLink
该记录的详细 View ?
documentation说要添加一个 view_name
参数,但这是否可以在 ModelViewSet
下进行,因为 View 实际上没有名称?
最佳答案
第一件事是所有 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 的超链接,但还需要一个步骤才能使其工作。这就是“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,您告诉框架您的详细 View 的名称是'content-detail'。
- 'content-detail' 只是我的 View 名称。你 需要找出你的(从上面的 url 名称实用程序)
这是示例的 http 响应(请参阅 url 字段):
关于python - 将 django-rest-framework 中的超链接添加到 ModelViewSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016973/