Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将django rest框架中的超链接添加到ModelViewSet_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python 将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名称,请尝试使用此实用程序

在Django Rest框架中,是否可以在ModelViewSet列表视图中链接到该记录详细视图的每条记录的
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'}
        }
  • “url”字段是显示链接的必填字段
  • 使用“extra_kwargs'>view_name”,您告诉框架您的详细视图的名称是“content detail”
  • “内容细节”只是我视图的名称。你 需要找到你的(从上面的url名称实用程序)
  • 这是来自示例的http响应(请参见url字段):


    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。非常感谢。