Как хранить важные запросы в самих моделях 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()
эквивалентны