Я знаю, что вы не можете вызывать метод с использованием фильтра, потому что он делает это на основе БД. Поэтому я пытаюсь написать собственный фильтр.Django - настраиваемый фильтр, который вызывает метод
@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
EDIT: Так Я попытался создать собственный пользовательский менеджер:
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, но o потому что я возвращаю список, я не могу связать эти звонки вместе. Мне нужен способ, чтобы иметь возможность передавать произвольное количество параметров.
Это похоже на место, где я, вероятно, захочу поставить фильтр. Как бы я начал писать фактический фильтр? Я хочу, чтобы фильтр мог вызвать любой метод или комбинацию методов. – JPC
Возможно ли, чтобы что-то вернуло запрос? Если бы я мог объединить свои фильтры вместе. – JPC
@JPC: «Что-то вернуть QuerySet?» Не легко. «потому что он делает это на основе БД». Не нужно. Вы можете легко добавить свои фильтры за пределы 'filter(). Filter()' свободного API-стиля QuerySet. –