【发布时间】:2018-06-11 15:58:54
【问题描述】:
我想允许我的一群用户运行任意和定期的查询。
到目前为止,我已经成功创建了这个模型:
class BasicQuery(models.Model):
id = models.AutoField(primary_key=True)
target_entity = models.CharField(max_length=255)
target_field = models.CharField(max_length=255)
operator = models.CharField(max_length=10)
compare_value = models.CharField(max_length=10)
active = models.BooleanField()
run_every = models.ForeignKey(QueryFrequency)
以及执行它的函数:
def rule_runner(rule):
target_entity = rule.target_entity
fieldname = rule.target_field
val = rule.compare_value
if rule.operator:
cmd = '{}.objects.filter({}__{}={})'.format(rule.target_entity,
rule.target_field,
rule.operator,
rule.compare_value)
else:
cmd = '{}.objects.filter({}={})'.format(rule.target_entity,
rule.target_field,
rule.compare_value)
return eval(cmd)
但是由于eval(cmd),代码太危险而无法投入生产,无论在调用此函数之前我会做多少测试,我都不会对此感到安全。关于如何以干净的方式实现此目的的任何建议?
【问题讨论】:
标签: django python-3.5