2010-08-17 122 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