Этот ответ умный, но он нарушает принцип Питона «явный лучше, чем неявный».Моя первая реакция на ваш код состояла в том, чтобы сказать вам, что вы не можете объявить пользовательский набор запросов внутри вашей модели, но я решил проверить упомянутый SO-ответ, чтобы узнать, откуда у вас эта идея.Опять же, это умно - не исключая этого, но хорошо написанный код самодокументируется и должен быть в состоянии быть выбранным любым случайным разработчиком Django и работать с ним.Вот где рецензии кода для коллег могут пригодиться - если бы у вас был такой, вы бы сразу получили WTF с этим.
Основная команда Django делает это следующим образом:
class MyQuerySet(models.query.QuerySet):
def some_method(self, an_arg, another_arg, a_kwarg='some_value'):
# do something
return a_queryset
class MyManager(models.Manager):
def get_query_set(self):
return MyQuerySet(self.model)
def some_method(self, *args, **kwargs):
return self.get_query_set().some_method(*args, **kwargs)
Это СУХОЙ в том смысле, что вы не повторяете фактическое определение метода в менеджере.Но это также ясно - вы точно знаете, что происходит.Это не такой СУХОЙ, как метод, на который вы ссылаетесь, но «явный лучше, чем неявный».Кроме того, если это делается в реальной кодовой базе Django, вы можете быть разумно уверены, что это хорошая практика в вашем собственном коде.И у него есть побочный эффект, который значительно облегчает расширение и переопределение в подклассах.