Исправление 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'. Вы должны предварительно получить это поле.

Вернуться на верх