2010-08-17 53 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代碼,這將是一個非常非常糟糕的主意。 – 2010-08-17 14:52:39

+0

大聲笑,我其實很想這麼做,因爲我將是唯一一個有權訪問的人。但是,如何序列化或類似的東西?也許我可以將字典變成過濾器......:/ – demux 2010-08-17 15:02:43

回答

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 2010-08-17 15:16:29

+0

filter({'one':'asdf','two':'xyz'})不起作用,但是filter(** {'one':'asdf','two':'xyz'})會。每當你「評估」任何你不信任的東西時,就有風險...... – 2010-08-17 15:25:15

+0

......另外,如果你想避免使用eval,你也許可以使用pickle來序列化/反序列化你的過濾詞典。 – 2010-08-17 15:35:40