How to use Python type hints with Django QuerySet?

后端 未结 9 963
一个人的身影
一个人的身影 2021-01-30 08:25

Is it possible to specify type of records in Django QuerySet with Python type hints? Something like QuerySet[SomeModel]?

For example, we have model:

9条回答
  •  误落风尘
    2021-01-30 08:53

    There's a special package called django-stubs (the name follows PEP561) to type your django code.

    That's how it works:

    # server/apps/main/views.py
    from django.http import HttpRequest, HttpResponse
    from django.shortcuts import render
    
    def index(request: HttpRequest) -> HttpResponse:
        reveal_type(request.is_ajax)
        reveal_type(request.user)
        return render(request, 'main/index.html')
    

    Output:

    » PYTHONPATH="$PYTHONPATH:$PWD" mypy server
    server/apps/main/views.py:14: note: Revealed type is 'def () -> builtins.bool'
    server/apps/main/views.py:15: note: Revealed type is 'django.contrib.auth.models.User'
    

    And with models and QuerySets:

    # server/apps/main/logic/repo.py
    from django.db.models.query import QuerySet
    
    from server.apps.main.models import BlogPost
    
    def published_posts() -> 'QuerySet[BlogPost]':  # works fine!
        return BlogPost.objects.filter(
            is_published=True,
        )
    

    Output:

    reveal_type(published_posts().first())
    # => Union[server.apps.main.models.BlogPost*, None]
    
    • Complete tutorial: https://sobolevn.me/2019/08/typechecking-django-and-drf
    • Types for django: https://github.com/typeddjango/django-stubs
    • Types for drf: https://github.com/typeddjango/djangorestframework-stubs

提交回复
热议问题