2016-02-18 10 views
4

Так что я хочу создать django filters.FilterSet от django-filter module, но хочу динамически добавлять его атрибуты. Например, если я хотел бы добавить SubName динамически:Django dynamic filterset

class UsersInfoFilter(filters.FilterSet): 
    Name=NumberFilter(lookup_type='gte') 
    def __new__(self): 
     self.SubName=NumberFilter(lookup_type='gte') 
     self.Meta.fields.append('SubName') 
    class Meta: 
     model = UsersInfo 
     fields = ['UserID', 'LanguageID', 'Name'] 

Проблема заключается в том, что FilterSet является метаклассом, что сразу же запускается после того, как класс был разобрался, так что нет нигде до этого момента, что элементы могут быть добавлены динамически ,

Я попытался поместить функцию в качестве параметра вокруг filters.FilterSet class UsersInfo(AddObjects(filters.FilterSet)), который возвращает именно то, что проходит, но я не могу ссылаться на UsersInfoFilter в этот момент, так как он еще не закончен.

Я также попытался сделать UsersInfoFilter своим собственным базовым классом, а затем создать class RealUsersInfoFilter(UsersInfoFilter, filters.FilterSet) в качестве моего фактического фильтра, но затем FilterSet просто выдает предупреждения об отсутствующих атрибутах, называемых полями.

Для классов в python не существует какой-либо функции-конструктора. Я предполагаю, что мне нужно делать магию с метаклассами, но я пробовал каждую комбинацию, о которой я могу думать, и я нахожусь в конце.

+1

Вы должны добавить тег 'django-filter', чтобы максимизировать шансы получить ответ. –

+0

Вы когда-нибудь находили для этого ответ? Я застрял на чем-то подобном. –

+0

К сожалению, решение никогда не появлялось. – Dakusan

ответ

0

Вы не можете изменить Meta подкласс от метода __init__ ... есть 2 варианта подходят ваш вопрос ...

Первый один - определить «широкий» фильтр на всех модельных полей:

class UsersInfoFilter(filters.FilterSet): 
    class Meta: 
     model = UsersInfo 

Он будет создавать фильтры по умолчанию для всех ваших полей модели.

Во-вторых, определить динамические поля:

class UsersInfoFilter(filters.FilterSet): 
    name = NumberFilter(lookup_type='gte') 

    def __init__(self): 
     super(UsersInfoFilter, self).__init__() 

     base_filters['subname'] = NumberFilter(name='subname', lookup_type='gte') 

    class Meta: 
     model = UsersInfo 
     fields = ['user_id', 'language_id', 'name'] 

(я не знаю, если это то, что вы действительно хотите - потому что, несмотря на «динамический» добавление поля - он должен быть объявлен как статический - нет никакой логики здесь)

ps Почему CamelCase по свойствам и полям? используйте правильный pep-8.