手记

Django项目中Django剑客(Django武士)与Django REST库大比拼

Pavel Danilyuk在Pexels上的照片(来自Pexels网站)

这篇文章比较了在Django项目中使用Django 忍者和Django REST API的方法,并重点介绍了它们在模式(schema)、序列化器(serializer)、过滤器、视图和URL方面的不同。

它不特别注重性能测试。

为此,我们创建一个API来进行Category模型的CRUD操作。这里不会涉及认证或授权。

软件包

写这篇文章时,使用了Django 5.0.6以及以下库:

对于DRF来说:

忍者:

在这种情况下,没有专门针对Swagger的外部库和过滤器,因为这些都是内置功能。

项目结构

下面这张图显示了Django应用在NinjaDRF中的结构差异。唯一不同在于这两个文件schemas.pyserializers.py

Django 应用结构适合 Ninja 和 DRF

这个是模型

下面的代码展示了在NinjaDRF中使用的_类别_数据模型定义。

数据模式与序列化

重要的是要注意,Ninja 使用 Pydantic 来验证数据的有效性,而 DRF 则使用自己的验证方式。

Django忍者

Django REST框架

字段验证示例代码

以下代码展示了如何在这两个库进行值校验。其中,有一个 value 字段 —— 这个字段必须大于0。

zh:Django ninja

Django REST接口

过滤

在这个 API 中,实现了一个过滤功能,允许通过名字搜索类别。

Django 忍者

Django REST框架

Ninja 在过滤方面的一个优势是它允许在其他具有 name 字段的模型中使用相同的过滤器。DRF 也允许类似的功能,但这种方式更加冗长,因为它是从带有名称过滤器的通用类继承而来,并定义了元类,如下例所示。

Django REST框架

看法

如下面所示,虽然 DRF 抽象了程序员从每个 API HTTP 方法中处理登录的需求,Ninja 需要编写所有的逻辑。然而,如下面的第二个代码片段所示,使用 django-ninja-crudNinja CRUD)库大大减少了代码量,使得 Ninja 更接近 DRF 提供的抽象功能。

Django Ninja

以下是使用django-ninja-crud库实现的相同版本,如下所示:

Django的CRUD技巧

虽然 API 逻辑已经做了很多抽象,这个 django-ninja-crud 还是带来了一些问题。

忍者 CRUD 为每个与 HTTP 相关的方法默认引入了一个 HTTP 请求正文。因此,我们可以在上面的代码示例中看到 _remove_swagger_requestbody 变量的声明及其在这些 API 方法中的使用。这样做是为了确保从 Swagger 中移除请求正文字段,因为 GET 和 DELETE 方法通常不期望有任何 HTTP 请求正文。

对于需要 ID (例如 URL 参数)的 HTTP 动词,Ninja CRUD 默认情况下返回 500 (内部服务器错误)的状态码,这是不正确的。为了正确返回 404 (未找到)的状态码,必须重写 _getmodel 方法。

在前面提到的两个例子中,我们可以看到前面声明的不同类别模式的使用。CategorySchema 用于返回该模型的所有数据。然而,在使用 POST 和 PUT 方法时,我们不想在 JSON 请求中传递类别 ID ,因此对于这些方法,我们使用 CategoryCreateSchema ,该模式不包含 ID 字段。同样,在使用 PATCH 方法时,我们只想发送一些类别字段。为此,我们使用 CategoryPartialUpdateSchema ,该模式中 ID 字段也被移除,并且其他所有字段都设置为可选,以避免 Ninja 验证错误。

下面展示的是DRF的视图代码。

Django Rest Framework

URLs

Ninja 已经内置了 Swagger,因此与 DRF 相比,不需要定义任何 URL 路径。

Django Ninja

Django Rest Framework

最后的总结

zh: Django高手

优点:

  • 它对新手更友好,因为它也迫使程序员去理解和掌握API工作的逻辑
  • 使用装饰器的显式API方法
  • 异步支持
  • 与Swagger有更好的、更简单的集成

不足:

  • 在总体和具体实现中很啰嗦
  • 小的细节会变得很繁琐(例如:可选字段定义)
  • Ninja CRUD(忍者 CRUD) 虽然让开发更简单,但也带来了一些问题
  • 如果一个 API 包含多个 HTTP 方法,项目中需要定义多个模式,这在大型项目中可能会变得复杂
  • 与 Django ORM 的集成不太好
  • 网上能找到的资料比 DRF 要少一些

Django REST框架

好处:

  • 非常适合声明式编程
  • 代码简洁,特别是在一般情况下
  • 快速实现
  • Django ORM无缝集成
  • 在线文档丰富详尽

缺点:

  • 在特定实现场景中会比较啰嗦

  • 需要对库的工作方式有较好的理解,特别是在处理具体情况时

  • 相比Ninja,还需要其他库来补充功能(比如:django-filterdrf-spectacular

这里提到的内容大多反映了在使用并比较了这两个库之后的个人看法。然而,选择必须始终取决于程序员或团队的个人偏好、对所选库的经验以及最适合项目需求的情况。

0人推荐
随时随地看视频
慕课网APP