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
Вот некоторые рекомендации, которые могут вам помочь
- Попробуйте добавить подсказки типов в свои пользовательские методы.
- Настройте Python-окружение VS Code на использование языкового сервера Pylance.
- Вы можете использовать специфические для 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