Djangoプロジェクトに取り組んでいます。これは新しいプロジェクトなので、python 3.6+型注釈で完全に注釈を付けたいです。私はmモデルに注釈を付けようとしていますが、そのための良い方法を見つけるのに苦労しています。
IntegerField
を例にとってみましょう。注釈を付ける方法は2つあります。
# 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に静的型と型推論を提供する一連のスタブと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
以下は、小さなビューでの使用例です。
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 。