Django 模型的类型注释

2024-03-09

我正在开发一个 Django 项目。由于这是一个新项目,我希望用 python 3.6+ 类型注释对其进行完全注释。我正在尝试注释模型,但我很难找到一个好的方法。

让我们以IntegerField举个例子。我看到有两种注释选择:

# number 1
int_field: int = models.IntegerField()

# number 2
int_field: models.IntegerField = models.IntegerField()

mypy 中的第 1 项失败:

Incompatible types in assignment (expression has type "IntegerField[<nothing>, <nothing>]", variable has type "int")

数字 2 对于 mypy 来说是可以的,但是像 PyCharm 这样的 IDE 无法解决它,并且经常抱怨使用了错误的类型。

是否有任何最佳实践来正确注释模型,从而满足 mypy 和 IDE 的要求?


Django 模型(和其他组件)很难注释,因为它们背后有很多魔力,好消息是一组很酷的开发者已经为我们做好了艰苦的工作。

Django 存根 https://github.com/typeddjango/django-stubs提供了一组存根和 mypy 插件,为 Django 提供静态类型和类型推断。

例如,具有以下模型:

from django.contrib.auth import get_user_model
from django.db import models

User = get_user_model()

class Post(models.Model):
    title = models.CharField(max_length=255)
    pubdate = models.DateTimeField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)

mypy 会抱怨说:

demo$ mypy .
demo/models.py:9: error: Need type annotation for 'title'
demo/models.py:10: error: Need type annotation for 'pubdate'
demo/models.py:11: error: Need type annotation for 'author'
Found 3 errors in 1 file (checked 5 source files)

要修复它,安装该软件包就足够了

pip install django-stubs

并创建一个setup.cfg文件包含以下内容:

[mypy]
mypy_path = ./demo
plugins =
    mypy_django_plugin.main

strict_optional = True

[mypy.plugins.django-stubs]
django_settings_module = demo.settings

(别忘了更新mypy_path and django_settings_module指向您的设置模块的目录,根据您的命名方式)

完成此操作后,mypy 将能够推断和检查 Django 模型(和其他组件)的注释。

demo$ mypy .
Success: no issues found in 5 source files

下面是小视图中的用法示例:

from django.db.models.query import QuerySet
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render

from demo.models import Post

def _get_posts() -> 'QuerySet[Post]':
    return Post.objects.all()

def posts(request: HttpRequest, template: str='posts.html') -> HttpResponse:
    return render(request, template, {'posts': _get_posts()})

mypy 再次对提供的注释感到满意:

demo$ mypy .
Success: no issues found in 7 source files

同样,Django Rest Framework 的包也可用:djangorest 框架存根 https://github.com/typeddjango/djangorestframework-stubs.

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

Django 模型的类型注释 的相关文章

  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • Django 中所有应用程序的基本模板

    我有一个包含 2 个应用程序的项目 project blog templates index html polls templates index html project templates base html index html 现在
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • Django 基于类的视图上的 success_url 的反向抱怨循环导入

    当使用基于方法的视图时 重定向为reverse没有抱怨这一点 并且仍然可以找到 root url conf 但是 在基于阶级的观点中 它抱怨 ImproperlyConfigured at blog new post The include
  • Elasticsearch 通过搜索返回拼音标记

    我用语音分析插件 https www elastic co guide en elasticsearch plugins current analysis phonetic html由于语音转换 从弹性搜索中进行一些字符串匹配 我的问题是
  • 双击打开 ipython 笔记本

    相关文章 通过双击 osx 打开 ipython 笔记本 https stackoverflow com questions 16158893 open an ipython notebook via double click on osx
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS

随机推荐

  • 如何在函数式编程中使用多态性? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在不同域的远程计算机上启动 Windows 服务

    我的电脑位于域 A 中 远程服务器位于域 B 中 我想使用 c 或任何其他语言或脚本从我的电脑重新启动服务器上的服务 Notes 我通过 VPN 连接到服务器 这意味着我可以手动 RDP 服务器并可以手动重新启动服务 我无法使用本地服务窗口
  • WCF 错误 未提供客户端证书。在 ClientCredentials 中指定客户端证书

    我正在尝试调用 WCF 服务 我创建了一个自签名证书并安装在我的 localmachine personnal certificates 中 并且我还在我的部分中添加了该证书 但我不明白为什么会出现此错误 这是我的 web config
  • 如何替换子资源请求中的嵌入凭据?

    我在 Ionic 应用程序的控制台中收到此错误 Deprecation Subresource requests whose URLs contain embedded credentials e g https user pass hos
  • 应用程序邀请配置失败 Firebase iOS cocoapods

    我在尝试新版本的 firebase 时遇到了一个构建错误 Terminating app due to uncaught exception com firebase appinvite reason App Invite configur
  • 如何在 JavaScript 中实现函数数组?

    我对 JavaScript 还很陌生 我需要编写一对 20 x 20 矩阵函数 我的所有函数都接受一个数字并返回一个数字 即相同的签名 例如 Myfunctions 1 2 应该返回一对可以在代码中调用的函数 在 Java 中 我通常会实现
  • multiprocessing.Pool.imap_unordered 的内存使用量稳步增长

    我刚刚注意到我的程序在处理大文件时使用越来越多的内存 不过 它一次只处理一行 所以我不明白为什么它会继续使用更多内存 经过大量挖掘 我意识到该程序由三个部分组成 加载数据 一次一行 处理a中的每一行multiprocessing Pool
  • 将元素添加到 xml 文件

    我正在尝试从 C csproj 文件添加和删除元素 该文件的部分内容如下所示 有人可以告诉我如何做以下两件事吗 添加一个元素 如下所示 该行显示 我想添加 这 删除一个元素 例如 假设我想删除 I 行 已在下面指出
  • 应用程序操作:通过动态快捷方式在 Google Assistant 中显示小部件

    考虑到官方文档和代码实验室中显示的选项 我的问题相对简单 但我一直在努力使其工作 我想通过动态快捷方式触发一个小部件在 Google Assistant 中显示 看起来非常简单 但是当实现这样的功能和动态快捷方式时
  • Rails 3 ajax 更新部分在没有页面刷新的情况下不起作用

    我正在开发 Rails 3 购物车 我有一个目录页面 其中显示所有产品 还有一个部分显示购物车的要点 因此 用户添加到购物车的任何产品都会显示在此购物车部分中 现在 这不起作用了 将产品添加到购物车后 我必须点击刷新 否则部分不会更新 这是
  • 如何从不同的活动获取主启动活动的意图?

    我目前正在进行另一项活动 如何获取主启动 Activity 的 Intent Intent launchIntent getIntent 上式中 显然getIntent 不会让我得到正确的Intent我需要的 我怎样才能获得主启动Activ
  • 导出 DLL 中的静态数据

    我有一个 DLL 其中包含一个静态类members I use declspec dllexport 为了利用这个类methods 但是 当我将其链接到另一个项目并尝试编译它时 我收到静态数据的 无法解析的外部符号 错误 例如 在DLL中
  • Python 小版本之间的 Wheel 不兼容性

    我正在 PyPi 上发布一个包 它将支持 Python 3 6 并且希望构建尽可能少的轮子 我读过Python 的轮子包装系统 https packaging python org guides distributing packages
  • javascript函数(输入大于今天日期的日期)

    我是 javascript 的初学者 我需要一个函数来检测用户是否输入日期 并在日期小于今天的日期时提醒他 HTML
  • 将角色混合到可调用对象中

    理论上 你可以在运行时将角色混合到对象中 https docs raku org language objects Mixins of Roles 所以我尝试用一 个函数来做到这一点 my random f gt arg Just arg
  • 使用 JavaScriptSerializer() 反序列化 JSON 文件

    我将反序列化的 json 文件的结构如下所示 id 1lad07 text test url http twitpic com 1lacuz width 220 height 84 size 8722 type png timestamp
  • 如何过滤数据透视表中按多个条件过滤的记录 - laravel eloquent collections

    我正在改建一个图书推荐个人网站 我想通过多个标准来过滤书籍 例如 我想展示所有哲学和科幻小说的书籍 彼得 瓦特的 盲视 就是一个例子 现在我只能做一个标准过滤器 我有一个数据透视表 示范书 public function genres re
  • 如何在没有主键的情况下对表或视图进行休眠映射[重复]

    这个问题在这里已经有答案了 可能的重复 Hibernate与无PK https stackoverflow com questions 767277 hibernate and no pk 有人知道如何在没有主键的情况下对表或视图进行休眠映
  • Autosys 中 ON ICE 和 ON HOLD 作业之间的区别

    搁置工作和冻结工作有什么区别 ON HOLD 和 ON ICE 作业之间有两个显着的区别 这决定了何时使用它们 当 ON HOLD 作业被推迟时 如果满足其启动条件 它将运行 而 ON ICE 作业在放入 OFF ICE 后 即使满足其启动
  • Django 模型的类型注释

    我正在开发一个 Django 项目 由于这是一个新项目 我希望用 python 3 6 类型注释对其进行完全注释 我正在尝试注释模型 但我很难找到一个好的方法 让我们以IntegerField举个例子 我看到有两种注释选择 number 1