Los modelos de Django (y otros componentes) son difíciles de anotar porque hay mucha magia detrás de ellos, una buena noticia es que un grupo de desarrolladores geniales ya han hecho el trabajo duro por nosotros.
django-stubs proporciona un conjunto de stubs y complementos mypy que proporcionan tipos estáticos e inferencia de tipos para Django.
Por ejemplo, tener el siguiente modelo:
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 se quejaría diciendo:
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)
Para solucionarlo, es suficiente instalar el paquete
pip install django-stubs
y crea un setup.cfg
archivo con lo siguiente:
[mypy]
plugins =
mypy_django_plugin.main
strict_optional = True
[mypy.plugins.django-stubs]
django_settings_module = demo.settings
(No olvide actualizar django_settings_module
según su módulo de configuración)
Una vez hecho esto, mypy podrá inferir y verificar anotaciones para los modelos de Django (y otros componentes).
demo$ mypy .
Success: no issues found in 5 source files
Aquí hay un ejemplo del uso en una vista pequeña:
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()})
Una vez más, mypy está contento con las anotaciones proporcionadas:
demo$ mypy .
Success: no issues found in 7 source files
En la misma nota, también está disponible un paquete para Django Rest Framework: djangorestframework-stubs .