Django DRF,如何使用 DRF 操作正确注册自定义 URL 模式

2024-01-12

背景

我有一个定义了多个自定义操作的 ModelViewSet。我正在使用我的默认路由器urls.py注册 URL。现在,我的视图使用默认创建的路由,例如^images/$, ^images/{pk}/$.

为了让用户能够使用他们熟悉的资源名称来使用 API,我调整了视图集以接受来自 URL 的多个参数,使用多字段查找混合 https://www.django-rest-framework.org/api-guide/generic-views/#creating-custom-mixins文档中描述的策略允许该模式images/{registry_host}/{repository_name}/{tag_name}.

我已经创建了get_object我的视图集中的方法如下:

class ImageViewSet(viewsets.ModelViewSet):
    ...
    def get_object(self):
        special_lookup_kwargs = ['registry_host', 'repository_name', 'tag_name']
        if all(arg in self.kwargs for arg in special_lookup_kwargs):
            # detected the custom URL pattern; return the specified object
            return Image.objects.from_special_lookup(**self.kwargs)
        else: # must have received pk instead; delegate to superclass
            return super().get_object()

我还为此添加了一个新的 URL 路径模式:

urls.py

router = routers.DefaultRouter()
router.register(r'images', views.ImageViewSet)
# register other viewsets
...

urlpatterns = [
    ...,
    path('images/<str:registry_host>/<path:repository_name>/<str:tag_name>', views.ImageViewSet.as_view({'get': 'retrieve',})),
    path('', include(router.urls)),
]

Problem

以上所有内容均按预期工作,但是,我还有一些额外的内容actions在此模型视图集中:

    @action(detail=True, methods=['GET'])
    def bases(self, request, pk=None):
        ...
    @action(detail=True, methods=['GET'])
    def another_action(...):
        ... # and so on

使用 DRF 注册的默认模式,我可以转到images/{pk}/<action> (like images/{pk}/bases) 触发额外的操作方法。但是我不能这样做images/{registry_host}/{repository_name}/{tag_name}/<action>。这在某种程度上是预料之中的,因为我从未注册过任何此类 URL,并且 DRF 没有合理的方式可以了解这一点。

I'm guessing我可以使用适当的参数手动添加所有这些路径path(...)但我不确定那会是什么。

urlpatterns = [
    ...,
    path('.../myaction', ???)
]

问题

主要问题是如何为我的 URL 添加操作?

但是,我想避免每次添加新的 URL 时都必须添加新的 URL@action()已添加到视图中。理想情况下,我希望这些在默认路径下自动注册images/{pk}/<action>images/{registry_host}/{repository_name}/{tag_name}/<action>.

作为次要问题,自动实现这一目标的适当方法是什么?我的guess也许是一个自定义路由器。但是,我不清楚如何为所有额外(详细)操作添加这些附加路由。

使用 django/drf 3.2


我看到的另一种方法是(ab)使用url_path与 kwargs 类似:

class ImageViewSet(viewsets.ModelViewSet):

    @action(detail=False, methods=['GET'], url_path='<str:registry_host>/<path:repository_name>)/<str:tag_name>/bases')
    def bases_special_lookup(...):
        # detail=False to remove <pk>

    @action(detail=True, methods=['GET'])
    def bases(...):
        ...

    @action(detail=False, methods=['GET'], url_path='<str:registry_host>/<path:repository_name>)/<str:tag_name>')
    def retrieve_special_lookup(...):
        # detail=False to remove <pk>

    def retrieve(...):
        ...

这将创建这些网址:

images/<str:registry_host>/<path:repository_name>/<str:tag_name>/bases
images/<pk>/bases
images/<str:registry_host>/<path:repository_name>/<str:tag_name>
images/<pk>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django DRF,如何使用 DRF 操作正确注册自定义 URL 模式 的相关文章

  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Django - 使用静态文件的奇怪行为

    我是姜戈的新手 我试图理解静态文件 css 和图像 发生了什么而变得疯狂 问题的简历如下 当我使用来自第三方应用程序 Haystack 的静态视图时 我无法使用静态文件 我的项目有这样的目录结构 1001empbr name of the
  • nginx 获取静态文件失败,返回 404

    我现在正在 ubuntu 12 上部署带有 nginx 和 Gunicorn 的 django 应用程序 我配置nginx虚拟主机文件如下 server listen 80 server name mydomain com access l
  • 如何自动更新外键以具有“,on_delete = models.PROTECT”

    我正在将旧代码更新到最新的 Django 版本 外键需要 on delete models PROTECT 他们有将近一百个 如何自动添加 on delete models PROTECT 到每一个 您可以尝试在这里使用正则表达式 鉴于Fo
  • 海量记录的bulk_create最佳实践

    I use bulk create将 1 mio 记录插入到新表中 需要 80 秒 Django 只使用一个 CPU 核心 大约 25 CPU 但没有一个核心达到 100 我相信有改进的潜力 这是代码 class Stock models
  • Django管理命令是在单独的进程中执行的吗?

    Django 有很多管理命令 此外 我们还可以编写自己的命令 进行 shell 调用后会发生什么python manage py XXX 代码是否会在从 shell 启动的进程中执行 或者 shell 进程只是与执行命令的主 Django
  • Django 管理内联以实现深层关系

    为直接关系创建内联非常容易 但是如何为更深层次的关系创建内联 假设情况是这样的 class A models Model class B models Model a models ForeignKey A class C models M
  • 使用 bootstrap 渲染的 Django FilteredSelectMultiple 小部件

    我正在尝试复制FilteredSelectMultipledjango 应用程序管理中使用的小部件 但我的小部件呈现非常不同 管理中的小部件使用Django 套装 http djangosuit com or django admin bo
  • 如何暂停或恢复 celery 任务?

    我的项目中有一项要求 客户可以暂停或恢复正在挂起的流程 而不是流程流程 我在用网络套接字显示芹菜任务结果 但在暂停 恢复时我不明白如何设计代码 我想到的唯一方法就是revoke暂停请求中的任务 同时保留数据撤销的过程在缓存中 并稍后在res
  • 如何使用 django Rest 框架通过直通模型序列化 ManyToManyField

    我有一个 Recipe 模型 其中包含 IngredientType 对象的 M2M 字段 该字段 又名成分列表 通过 Ingredient 对象使用臭名昭著的 through 模型 该对象将额外的数据添加到我的 IngredientTyp
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • Django 简单历史 - save_without_historical_record() 对我不起作用

    我花了两天时间努力完成这项工作 我正在尝试使用 Django Simple History 进行记录而不保存历史记录 情况如下 我有一个模型 class Artikel models Model treaty models ForeignK
  • 在 django 中导入设置时出现奇怪的错误

    我有很多项目在 ubuntu 中使用 python2 7 和 virtualenv virtualenvwrapper 工作 在我的工作中 一些开发人员使用 macosx 和 windows 通常我像往常一样创建项目 django admi
  • 404因为重新启动webpack-dev-server

    当我尝试更改反应组件并保存它以查看热加载器是否更新了我的页面时 我在开发人员工具中得到了这个 GET http localhost 3000 public bundle 76566a1ad7e45b834d4e hot update jso
  • Django 1.11 我们可以在两个不同数据库的表之间创建关系吗?

    在我的项目中 我试图创建具有多个数据库的中央数据库服务 所以我的问题是我们可以在两个不同数据库的表之间创建关系吗 Example MySQL DB1 表用户 class User models Model name models CharF
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • Django添加简单自定义字段——如何编写South Introspection规则

    我正在尝试将自定义字段添加到我的 Django 项目中 该项目使用South http south aeracode org 因此 我 第一次 尝试写南方的自省规则 http south aeracode org wiki MyFields
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • django 迁移地狱,丢了一张表。试图把它找回来

    所以我在数据库中删除了一个表 并且希望将其恢复 重新运行迁移会出现错误表不存在 经过一番搜寻后 我了解到我可以删除 django migrations 中应用程序名为我的应用程序的所有内容 所以我这样做了 重新运行迁移 它开始工作 然后抱怨
  • API 端点的 Django 子域配置

    我已经建立了一个 Django 项目 它使用django rest framework提供一些 ReST 功能 网站和其他功能都运行良好 然而有一个小问题 我需要我的 API 端点指向一个不同的子域 例如 当用户访问该网站时 他 她可以根据

随机推荐

  • Java中Thread.currentThread().join()的使用

    以下代码取自 Jersey 项目中的示例 看here https github com jersey jersey blob 2 22 1 examples helloworld src main java org glassfish je
  • JavaScript 中的 sCrypt 实现? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人问一个bCrypt 的 JavaScript 实现 https stackoverflow com
  • Python pandas 数据框警告,建议使用 .loc 代替?

    您好 我想通过删除丢失的信息并使所有字母小写来操作数据 但对于小写转换 我收到此警告 E Program Files Extra Python27 lib site packages pandas core frame py 1808 Us
  • 在纯 JavaScript 中进行“同步”AJAX 调用时如何显示“正在加载”?

    我想确保向用户显示结果 因此我进行同步 AJAX 调用 使用异步 AJAX 显示 正在加载 指示器非常简单 示例无处不在 但是当我使用带有 XMLHttpRequest 的同步 AJAX 调用时 加载指示器 GIF 图像根本不显示 有人说在
  • Visual Studio - Nuget - 无法加载源的服务索引

    这是我的 NuGet config
  • Binance API如何计算24小时内的priceChangePercent

    我正在开发自己的应用程序 我想在其中检索 24 小时内的价格数据 我已阅读币安提供的文档 https github com binance exchange binance official api docs blob master res
  • 如何使我的安装项目生成可执行文件?

    我构建了一个小型桌面应用程序 尝试使用安装项目来允许其他用户安装它 但每当我运行此安装程序时 它都不会生成可执行文件 这是我第一次制作安装项目 我的解决方案包含两个项目 一个是安装项目 它安装另一个项目的主要输出 另一个项目是一个 WPF
  • 修复 Lisp 语法

    作为 Lisp 的新手 我想知道 Lisp 语法是否可以 修复 有人说 Lisp 的语法是其最大的优势之一 我不太明白这一点 难道不能用空格 换行和缩进的组合来替换 明显的 括号吗 就像Python一样 在我看来 括号是 Lisp 代码中最
  • 使用要删除的列的参数从 R data.table 中删除多列

    我正在尝试以类似的方式操作多个 data tables 并且想编写一个函数来完成此操作 我想传递一个参数 其中包含将执行操作的列列表 当列的向量声明位于 运算符的左侧时 此方法可以正常工作 但如果它是较早声明的 或传递到函数中 则效果不佳
  • Bootstrap:居中 col-md-5?

    我觉得这是一个很奇怪的问题 但我似乎无法在网上找到解决方案 如果我有一个col md 5 我似乎无法将其居中 据我了解网格系统 如果我选择列大小 1 12 为了控制列的位置 我使用 col offset 所以如果我有一个col md 4 我
  • Dart 运行时检查 switch 语句中的类型

    我在尝试检查 Dart 中某些对象的运行时类型时发现了一些奇怪的行为 让我们举一个简单的例子 main List
  • 如何以编程方式将最小化的无模式 WinForm 带到之前显示的位置?

    为了在单击事件时将无模式 Windows 窗体恢复到其先前的位置 我尝试使用下面所示的代码 但它不起作用 如果我遗漏了什么 请告诉我 public void SetFocus this Focus this BringToFront if
  • MVC 3 从 web.config 中的 AppSettings 获取值

    在普通的 ASP NET Web 表单站点中 我会使用 web configs appsettings 将应用程序设置数据添加到站点 但是 在使用 MVC 3 时 我无法以这种方式检索设置值 首先 有 2 个 web config 文件 第
  • wx.TextCtrl(或底层 GTK+)的多线程问题

    我正在开发一个GUI来启动外部长期运行的后台程序 该后台程序可以通过 stdin 给出输入命令 并使用 stdout 和 stderr 来保持打印输出和错误消息 我在 GUI 中使用 wx TextCtrl 对象来提供输入和打印输出 我当前
  • 允许图像缩小,但不允许拉伸

    我的网站有 4 000 多个页面 每页有 10 个或更多不同大小的 jpeg 图像 我正在努力使该网站对移动设备更加友好 为此 我希望能够缩小图像以适应较小的屏幕 我知道我可以做这样的事情来表明图像可以缩小 img bodyImg widt
  • 下载图像并在 BlackBerry 上显示

    我必须开发一个网址 其中涉及从网址下载图像并在黑莓刺激器中显示 任何人都可以在这方面帮助我吗 此代码将连接给定的 URL 并返回 Bitmap 对象 public static Bitmap connectServerForImage St
  • LINQ 表达式> 相当于 .Contains()

    有谁知道如何使用 Linq 表达式创建 Contains string 函数 甚至创建谓词来完成此操作 public static Expression
  • 如何仅使用 CSS 制作选项卡? [复制]

    这个问题在这里已经有答案了 我正在寻找像这样的选项卡系统jQuery 选项卡 http jqueryui com tabs 用户可以在不同的面板之间切换以查看不同的内容 但是 我需要在不使用 JavaScript 的情况下完成此操作 以便未
  • C/C++ 是否有允许任意精度指数的任意精度浮点库?

    我正在寻找 C C 的任意精度浮点库 首选普通 C 我需要任意精度的指数 GMP 和 MPFR 使用固定大小的指数 因此它们不符合条件 我有一些解决方法的想法 但我更喜欢开箱即用的解决方案 如果指数精度可以自动调整以防止无穷大值 那将是一个
  • Django DRF,如何使用 DRF 操作正确注册自定义 URL 模式

    背景 我有一个定义了多个自定义操作的 ModelViewSet 我正在使用我的默认路由器urls py注册 URL 现在 我的视图使用默认创建的路由 例如 images images pk 为了让用户能够使用他们熟悉的资源名称来使用 API