Django-Modelle (und andere Komponenten) sind schwer zu kommentieren, da viel Magie dahinter steckt. Eine gute Nachricht ist, dass eine Gruppe cooler Entwickler bereits die harte Arbeit für uns geleistet hat.
django-stubs bietet eine Reihe von Stubs und mypy-Plugins, die statische Typen und Typinferenzen für Django bereitstellen.
Zum Beispiel mit folgendem Modell:
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 würde sich beschweren und sagen:
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)
Um das Problem zu beheben, reicht es aus, das Paket zu installieren
pip install django-stubs
und erstellen Sie eine setup.cfg
Datei mit den folgenden Angaben:
[mypy]
plugins =
mypy_django_plugin.main
strict_optional = True
[mypy.plugins.django-stubs]
django_settings_module = demo.settings
(Vergessen Sie nicht, django_settings_module
entsprechend Ihrem Einstellungsmodul zu aktualisieren )
Sobald dies erledigt ist, kann mypy Anmerkungen für Django-Modelle (und andere Komponenten) ableiten und überprüfen.
demo$ mypy .
Success: no issues found in 5 source files
Hier ist ein Beispiel für die Verwendung in einer kleinen Ansicht:
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()})
Wieder einmal ist mypy mit den bereitgestellten Anmerkungen zufrieden:
demo$ mypy .
Success: no issues found in 7 source files
Aus dem gleichen Grund ist auch ein Paket für Django Rest Framework verfügbar: djangorestframework-stubs .