python - Django 模型的类型注释

标签 python django type-annotation

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

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

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

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

数字 1 在 mypy 中失败:
Incompatible types in assignment (expression has type "IntegerField[<nothing>, <nothing>]", variable has type "int")

2 号对于 mypy 来说是可以的,但作为 PyCharm 的 IDE 无法解决它,并且经常提示使用了错误的类型。

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

最佳答案

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

django-stubs提供了一组为 Django 提供静态类型和类型推断的 stub 和 mypy 插件。

例如,具有以下模型:

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]
plugins =
    mypy_django_plugin.main

strict_optional = True

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

(不要忘记根据您的设置模块更新django_settings_module)

完成此操作后,mypy 将能够推断和检查 Django 模型(和其他组件)的注释。
demo$ mypy .
Success: no issues found in 5 source files

下面是一个小 View 的用法示例:

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 的包也可用:djangorestframework-stubs .

关于python - Django 模型的类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59031982/

相关文章:

python - GPU 在 Google Colaboratory 上的 Pytorch 性能比 CPU 慢

django - mySQL CSV 导入中的未知列

python - 如何在一个页面中显示多条django消息?

python-3.x - 类型注释: Extract inner type from container type

python - 从 SQL 表定义创建 Django 模型

python - 如何使用 Seaborn 创建 FacetGrid 堆叠条形图?

python - Gtk* 后端需要安装 pygtk

python - 如何在 Django 1.7 中提供具有可能的子目录的特定目录?

相同的通用函数签名的 Python 类型注释

swift - 如何将Character类型注解转成String类型注解?