Я знаю, что вы не можете вызвать метод, используя фильтр, потому что он делает это на основе БД. Поэтому я пытаюсь написать собственный фильтр.
@staticmethod
def custom_filter(obj,method_name, arg=False):
for i in obj.objects.all():
if getattr(i, method_name)() == arg:
yield i
Я могу заставить это работать, если позвоню:
MyModel.custom_filter(MyModel,'my_method','myarg')
однако я не могу связать их вместе, как обычные фильтры.
Я мог бы сделать что-то вроде этого:
@staticmethod
def custom_double_filter(obj,method1,arg1,method2,arg2):
for i in obj.objects.all():
if getattr(i, method1)() == arg1 and getattr(i,method2)()==arg2:
yield i
но я бы хотел, чтобы он поддерживал произвольное количество фильтров И некоторые методы имеют свои собственные аргументы
@staticmethod
def custom_double_filter(obj,method1,arg1,method2,arg2):
for i in obj.objects.all():
if getattr(i, method1)(<may need to pass an argument>) == arg1 and getattr(i,method2)()==arg2:
yield i
РЕДАКТИРОВАТЬ: Итак, я попытался сделать пользовательский менеджер, например, так:
class GroupManager(models.Manager):
use_for_related_fields = True
def custom_filter(self,method_name, arg=False):
results = []
for i in self.all():
if getattr(i, method_name)() == arg:
results.append(i)
return results
Это работает для одного вызова custom_filter, но, очевидно, поскольку я возвращаю список, я не могу связать эти вызовы вместе. Мне нужен способ, чтобы иметь возможность передавать произвольные числа параметров