【问题标题】:Django model filters stored in database存储在数据库中的 Django 模型过滤器
【发布时间】:2010-08-17 14:46:02
【问题描述】:

我正在处理 feincms 中的内容类型。我想制作一种可以在数据库中存储过滤器的内容类型。 大概是这样的:

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

【问题讨论】:

  • 过滤器的示例值是什么样的?我猜你必须将它们解析为 Python 代码,这将是一个非常非常糟糕的主意。
  • 大声笑,我实际上很想这样做,因为我将是唯一可以访问的人。但是序列化或类似的东西怎么样?也许我可以以某种方式将字典变成过滤器...:/

标签: django django-models


【解决方案1】:

您应该能够使用过滤器和排除字段的字典来做到这一点。

假设您要添加此过滤器:

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

然后你会存储

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

作为 NewsContentModel 的过滤器字段中的字符串。

那么你可以这样做

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

我认为应该可以...

【讨论】:

  • eval 仍然存在安全问题。但你是说: ...filter({one:'asdf', two:'xyz'}) 真的有用吗?
  • filter({'one':'asdf', 'two':'xyz'}) 不起作用,但是 filter(**{'one':'asdf', 'two': 'xyz'}) 会。任何时候你“评估”任何你不信任的东西,都有风险......
  • ...另外,如果您想避免使用 eval,您可以使用 pickle 来序列化/反序列化您的过滤器字典。
  • 您可能应该为此使用适当的 JSON 编码器/解码器。构建一个能够通过自动生成的表单字段编辑 JSON 数据的 Form 类也不难。
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多