Django - VS Code - типизация метода менеджера пользовательских моделей

Я пробую использовать пользовательские менеджеры моделей для добавления аннотаций к кверисетам.
Моя проблема, которая началась как небольшое раздражение, но теперь я понимаю, что это может быть реальной проблемой, заключается в том, что VS Code не распознает методы, определенные в пользовательском менеджере моделей/кверисете.

Пример:

from django.db import models
from rest_framework.generics import ListAPIView


# models.py
class CarQuerySet(models.QuerySet):
    def wiht_wheels(self): # NOTE: intentional typo
        pass # assume this does some annotaion


class Car(models.Model):
    objects = CarQuerySet.as_manager()


# views.py
class ListCarsView(ListAPIView):
    def get_queryset(self):
        return Car.objects.wiht_weels()  # <--- white instead of yellow

Сначала меня просто раздражал тот факт, что wiht_weels печатается белым цветом, в отличие от обычного желтого для методов/функций.

Затем я еще больше разозлился, потому что это означает, что VS Code не даст мне никаких подсказок о том, какие аргументы ожидает метод или что он возвращает.

Наконец, я случайно сделал опечатку в имени одного из этих пользовательских методов модели, я нажал refactor->rename, но он переименовал его только на месте, а не в местах, где он используется (представления), вероятно, потому что VS Code не понимает, что этот метод используется где-либо.

Есть ли решение этой проблемы?

Вам придется явно предоставлять подсказки типов.

# views.py
class ListCarsView(ListAPIView):
    def get_queryset(self):
        objects: CarQuerySet = Car.objects # Type hint
        return objects.with_wheels()  # yellow

Вот некоторые рекомендации, которые могут вам помочь

  1. Попробуйте добавить подсказки типов в свои пользовательские методы.
  2. Настройте Python-окружение VS Code на использование языкового сервера Pylance.
  3. Вы можете использовать специфические для Django расширения для улучшения понимания VS Code моделей и наборов запросов Django.

Если вам нужно, я могу помочь вам с настройкой Pylance, добавлением подсказок типов в ваш код или помочь вам использовать специфические для Django расширения, чтобы улучшить ваш рабочий процесс в VS Code.

Надеюсь, это поможет вам

Добавьте несколько аннотаций типов к методам вашего класса:


from django.db import models
from rest_framework.generics import ListAPIView


# models.py
class CarQuerySet(models.QuerySet):

    def with_wheels(self) -> "CarQuerySet":  # quotes here
        pass


class CarManager(models.Manager):

    def get_queryset(self) -> CarQuerySet:  # update the definition here
        return CarQueryset(self.model, using=self._db)

    def with_wheels(self) -> CarQuerySet:  # redefine method here
        return self.with_wheels(self):


class Car(models.Model):
    objects: CarManager = CarManager  # add a type hint here

vs-код теперь будет показывать методы набора запросов клиента в любое время, когда вы вызываете их из модели Car:

Car.objets.with...   # try this
Вернуться на верх