python - 将 django-rest-framework 中的超链接添加到 ModelViewSet

标签 python django rest django-rest-framework

在 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'}
        }
  1. “url”字段是显示链接的必填字段。
  2. 通过'extra_kwargs' > view_name,您告诉框架您的详细 View 的名称是'content-detail'。
  3. 'content-detail' 只是我的 View 名称。你 需要找出你的(从上面的 url 名称实用程序)

这是示例的 http 响应(请参阅 url 字段):

enter image description here

关于python - 将 django-rest-framework 中的超链接添加到 ModelViewSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016973/

相关文章:

java - 将 GET 响应从 restTemplate 转换为自定义类

python - ProgrammingError : (1146, "Table ' test_<DB>.<TABLE >' doesn' t exist") 为 Django 运行单元测试时

python - 如何优化 numpy 调用的数据生成

python - Python强制子进程失败并获得不为零的返回码

python - django - 将数据库添加到heroku时出错

Django - http 代码 304,如何在测试服务器中解决?

flash - 使用 Flash 进行基本身份验证

python - 尝试在 Mac OS 中使用 pycharm 运行此命令 "pipenv lock "时出现 pipenv 内部错误

python - BeautifulSoup 和转换 HTML 实体的奇怪行为

javascript - 将 REST API 调用从 Angular 转换为 jQuery