Как хранить важные запросы в самих моделях Djando?

Есть несколько запросов, которые важны и используются несколько раз в разных частях приложения. Я думаю, что было бы здорово иметь метод в самой модели для получения запрашиваемых данных по мере необходимости. Я пробовал метод класса и метод экземпляра, но когда менеджер вызывается в запросе, я получаю следующую ошибку:

AttributeError: Manager isn't accessible via ... instances

код выглядит следующим образом:

class XDL(models.Model):
    name = models.CharField(max_length = 20)
    Order_Code_Description = models.CharField(max_length = 355)
    Status = models.CharField(max_length = 20)
    Supplier = models.CharField(max_length = 100)

    @classmethod
    def get_count_xdls(cls):
        return cls.objects.all() #query example

    def get_all_supps(self):
        return self.objects.all() #query example

объясняется в документации Django ниже:

Managers are accessible only via model classes, rather than from model instances, to enforce a separation between “table-level” operations and “record-level” operations

Существует ли лучшая практика хранения важных запросов в методе где-то в Model (или других частях)? Поскольку эти запросы выполняются несколько раз, а также написание их в виде метода также помогает документации.

Менеджер клиентов - это мощный инструмент для факторизации кода и маркировки сложных запросов.

class XDLManager(models.Manager):
    pass

class XDLQuerySet(models.QuerySet):
    def supplied_by_foo(self):
        return self.filter(supplier='Foo')

class XDL(models.Model):
    objects = XDLManager.from_queryset(XDLQuerySet)()

Любые методы, определенные в XDLManager, будут доступны только за XDL.objects, методы, определенные в XDLQueryset, будут доступны как за XDL.objects, так и за любой функцией, возвращающей queryset (например, XDL.objects.all()).

XDL.objects.filter(supplier='Foo') и XDL.objects.supplied_by_foo() эквивалентны

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