Python 将django rest框架中的超链接添加到ModelViewSet
在Django Rest框架中,是否可以在ModelViewSet列表视图中链接到该记录详细视图的每条记录的Python 将django rest框架中的超链接添加到ModelViewSet,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,在Django Rest框架中,是否可以在ModelViewSet列表视图中链接到该记录详细视图的每条记录的id字段上添加HyperLink 声明要添加一个view\u name参数,但这是否可以在ModelViewSet下执行,因为视图实际上没有名称?第一件事是所有ModelViewSet URL都有名称,即使您没有显式设置这些名称 您可以在文档中找到如何在路由器中创建默认url:(请参阅“SimpleRouter”url名称表) 要查看应用程序中可用的所有实际url名称,请尝试使用此实用程序
id
字段上添加HyperLink
声明要添加一个
view\u name
参数,但这是否可以在ModelViewSet
下执行,因为视图实际上没有名称?第一件事是所有ModelViewSet URL都有名称,即使您没有显式设置这些名称
您可以在文档中找到如何在路由器中创建默认url:(请参阅“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)
然后,在URL.py中:
urlpatterns = [
url(r'^', include(router.urls)),
]
if settings.DEBUG:
print_url_pattern_names(urlpatterns)
如果希望url与ModelViewSet的名称不同(如我的情况),可以在路由器上使用“base_name”进行设置:
接下来需要扩展HyperlinkedModelSerializer:
from rest_framework import serializers
# in this sample my object is of type "Media"
class MediaSerializer(serializers.HyperlinkedModelSerializer):
#blablabla
您将有一个序列化程序,可以显示到详细视图的超链接,但这还需要一个步骤。这就是“视图名称”的由来:
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'}
}
xleon的答案有一些更新: 使用Python3和新的Django函数,要查看所有urlpatterns,您应该使用如下内容:
def print_url_pattern_names(patterns):
"""Print a list of urlpattern and their names"""
for pat in patterns:
if pat.__class__.__name__ == 'URLResolver': # load patterns from this URLResolver
print_url_pattern_names(pat.url_patterns)
elif pat.__class__.__name__ == 'URLPattern': # load name from this URLPattern
if pat.name is not None:
print('[API-URL] {:>50} -> {}'.format(pat.name, pat.pattern))
print_url_pattern_names(urls.urlpatterns)
我花了一些时间来解决它,所以也许它会帮助一些人
我如何使用它:运行“python manage.py shell”,然后
然后复制此函数并按如下方式运行:
def print_url_pattern_names(patterns):
"""Print a list of urlpattern and their names"""
for pat in patterns:
if pat.__class__.__name__ == 'URLResolver': # load patterns from this URLResolver
print_url_pattern_names(pat.url_patterns)
elif pat.__class__.__name__ == 'URLPattern': # load name from this URLPattern
if pat.name is not None:
print('[API-URL] {:>50} -> {}'.format(pat.name, pat.pattern))
print_url_pattern_names(urls.urlpatterns)
这里您将
'contents-detail'
设置为url名称。是否需要在url.py
中声明此url?否。如我所述,路由器/模型视图集将为您创建url:。但在我的特殊情况下,考虑到我希望url以“内容”而不是“媒体”开头,我在url.py(编辑文章)上设置了,我删除了视图名称的额外的\u kwargs
,因为它在超链接模型序列化程序中不需要,而且它工作正常。此外,这个答案帮助我使它工作:。我还是给你的答案打+1。非常感谢。