Исправление Django "Unresolved attribute reference" для поля с предварительной выборкой
Допустим, у меня есть следующие модели Django:
class Toolbox(models.Model):
name = models.CharField(max_length=255)
tools = models.ManyToManyField("Tool")
class Tool(models.Model):
class Size(models.TextChoices):
SMALL = "S"
MEDIUM = "M"
LARGE = "L"
name = models.CharField(max_length=255)
size = models.CharField(max_length=10, choices=Size.choices)
У меня есть функция для получения всех маленьких инструментов для каждого набора инструментов. @queries_disabled()
берется из django-zen-queries, чтобы убедиться, что маленькие инструменты были предварительно собраны и избежать проблем с производительностью N+1.
@queries_disabled()
def get_toolbox_to_small_tools_mappings(toolboxes: list[Toolbox]) -> dict:
return {toolbox: toolbox.small_tools for toolbox in toolboxes}
Проблема в том, что мой редактор (PyCharm) выделяет предупреждение:
Нерешенная ссылка на атрибут 'small_tools' для класса 'Toolbox'
Я могу исправить это, изменив подсказку типа аргумента:
def get_toolbox_to_small_tools_mappings(toolboxes: list[Toolbox] | QuerySet): ...
Мне кажется, что это немного халтурно. Есть ли лучший способ исправить это?
Более того, я хотел бы предоставить полезное сообщение об ошибке для вызывающей функции, если она забудет предварительно получить эти данные. Сейчас сообщение об ошибке выглядит так:
AttributeError: объект 'Toolbox' не имеет атрибута 'small_tools'
Как я могу предоставить более явное сообщение об ошибке, которое говорит что-то вроде:
У объекта 'Toolbox' нет атрибута 'small_tools'. Вы должны предварительно получить это поле.