Код: Выделить всё
from django.db import models
class CustomQuerySet(models.QuerySet):
def live(self):
return self.filter(is_draft=False)
class CustomManager(models.Manager):
def publish(self, instance: "MyModel"):
instance.is_draft = False
instance.save()
Код: Выделить всё
class MyModel(models.Model):
objects: CustomManager = CustomManager().from_queryset(CustomQuerySet)()
is_draft = models.BooleanField(blank=True, default=True)
Удаление аннотации типа приводит к аналогичной жалобе: невозможно атрибут доступа «live» для класса «BaseManager[MyModel]». Атрибут «live» неизвестен.
Как аннотировать объекты в MyModel, поэтому Pylance будет знать, что у объектов также доступны методы CustomQuerySet, а не только методы CustomManager?
Просматриваем Источник Джанго from_queryset создает новый подкласс CustomManager, перебирая методы CustomQuerySet:
Код: Выделить всё
@classmethod
def from_queryset(cls, queryset_class, class_name=None):
if class_name is None:
class_name = "%sFrom%s" % (cls.__name__, queryset_class.__name__)
return type(
class_name,
(cls,),
{
"_queryset_class": queryset_class,
**cls._get_queryset_methods(queryset_class),
},
)
код>. Таким образом, фундаментальный вопрос заключается в следующем: как напечатать аннотацию этого динамически генерируемого подкласса таким образом, чтобы, по крайней мере, было достаточно хорошо для работы проверки типов и автозаполнения?
Подходы, которые Я рассмотрел до сих пор неудовлетворительные результаты:
- Django не вводит аннотированный возврат from_queryset.
- Django-типы аннотирует его как type[Self], в котором отсутствуют методы CustomQuerySet.
- То же самое с заглушками Django.
Подробнее здесь: https://stackoverflow.com/questions/792 ... m-queryset
Мобильная версия