urls template queryset gte examples python django type-hinting

python - template - django views



¿Cómo utilizar las sugerencias de tipo Python con Django QuerySet? (3)

Estoy buscando una solución a esto también. La lista de Desarrolladores de Django tiene un thread en el que están discutiendo cómo implementar una característica de este tipo.

Actualmente están desarrollando una extensión de Django para mypy , pero parece que no tenemos suerte con nuestra solicitud específica. En su hoja de ruta bajo el encabezado de "Probablemente nunca":

Los Querysets pueden tener algún soporte parcial, pero los argumentos complejos (como los de filtro y obtener consultas) o los objetos Q y F están más allá de las posibilidades expresivas de mypy como lo son ahora.

Dicho esto, solo tendremos que usar el QuerySet ole QuerySet hasta que las condiciones mejoren.

¿Es posible especificar el tipo de registros en Django QuerySet con sugerencias de tipo Python? Algo como QuerySet[SomeModel] ?

Por ejemplo, tenemos modelo:

class SomeModel(models.Model): smth = models.IntegerField()

Y queremos pasar el QuerySet de ese modelo como param en func:

def somefunc(rows: QuerySet): pass

Pero cómo especificar el tipo de registros en QuerySet, como con List[SomeModel] :

def somefunc(rows: List[SomeModel]): pass

pero con QuerySet?


Si quieres pasar un param solo haz esto:

def somefunc(smth): pass

Si quieres devolver un tipo de lista usa la función list() .


Una solución puede ser usar la clase de escritura Union.

from typing import Union, List from django.db.models import QuerySet from my_app.models import MyModel def somefunc(row: Union[QuerySet, List[MyModel]]): pass

Ahora, cuando corte el argumento de la row , sabrá que el tipo devuelto es otra lista de MyModel o una instancia de MyModel, mientras que también indica que los métodos de la clase QuerySet están disponibles en el argumento de la row .