2010-08-17 3 views
2

Я работаю с типами контента в feincms. И я хочу создать тип контента, который может хранить фильтры в базе данных. Примерно это будет выглядеть следующим образом:Фильтры модели Django, хранящиеся в базе данных

from news.models import Entry 
class NewsContent(models.Model): 
    filter = models.CharField() 
    exclude = models.CharField() 
    offset = models.IntegerField() 
    limit = models.IntegerField() 
    #template = models.CharField() 

    def get_entries(self): 
     return Entry.objects.filter(self.filter).exclude(self.exclude)[self.offset:self.limit_upper] 

Возможно ли это?

Теперь это может или не может быть хорошей идеей скорости мудрым, но это вопрос № 2

+0

Что бы пример значения фильтра выглядеть? Я бы предположил, что вам придется разбирать их как код Python, что было бы очень и очень плохой идеей. –

+0

lol, я на самом деле очень соблазн сделать это, так как я буду единственным, у кого есть доступ. Но как насчет сериализации или что-то в этом роде? Возможно, я смогу сделать словари в фильтрах как-то ...:/ – demux

ответ

2

Вы должны быть в состоянии сделать это с помощью словаря для фильтра и исключения поля.

Допустим, вы хотите добавить этот фильтр:

...filter(one='asdf', two='xyz') 

, то вы бы хранить

"{'one':'asdf', 'two':'xyz'}" 

в виде строки в фильтре поле вашего NewsContentModel.

, то вы можете сделать это

def get_entries(self): 
    return Entry.objects.filter(**eval(self.filter)) 

Я думаю, что должно работать ...

+0

Проблема с eval по-прежнему сохраняется. Но вы говорите следующее: ... filter ({one: 'asdf', two: 'xyz'}) действительно сработает? – demux

+0

фильтр ({'one': 'asdf', 'two': 'xyz'}) не будет работать, но фильтр (** {'one': 'asdf', 'two': 'xyz'}) будет. Каждый раз, когда вы «eval» ничего не доверяете, существует риск ... –

+0

... также вы можете использовать pickle для сериализации/десериализации словаря фильтра, если вы хотите избежать использования eval. –

Смежные вопросы