Django 在数据库中存储用户定义的筛选器
我需要允许用户为我的一个模型创建和存储过滤器。我唯一的好主意是这样的:Django 在数据库中存储用户定义的筛选器,django,django-models,Django,Django Models,我需要允许用户为我的一个模型创建和存储过滤器。我唯一的好主意是这样的: class MyModel(models.Model): field1 = models.CharField() field2 = models.CharField() class MyModelFilter(models.Model): owner = models.ForeignKey('User', on_delete=models.CASCADE, verbose_name=_('F
class MyModel(models.Model):
field1 = models.CharField()
field2 = models.CharField()
class MyModelFilter(models.Model):
owner = models.ForeignKey('User', on_delete=models.CASCADE, verbose_name=_('Filter owner'))
filter = models.TextField(_('JSON-defined filter'), blank=False)
因此过滤器字段存储一个字符串,如:
{“field1”:“value1”,“field2”:“value2”}
。
然后,在代码中的某个地方:
filters = MyModelFilter.objects.filter(owner_id=owner_id)
querysets = [MyModel.objects.filter(**json.loads(filter)) for filter in filters]
result_queryset = reduce(lambda x, y: x|y, querysets)
这是不安全的,我需要以某种方式控制可用的过滤键。另一方面,它提供了django queryset过滤器的全部功能。例如,通过这段代码,我可以过滤相关的模型。
所以我想知道,有没有更好的方法来解决这个问题,或者是第三方库来实现相同的功能
UPD:
reduce
在代码中用于使用或条件进行过滤
UPD2:
系统的另一部分将使用用户定义的过滤器来过滤新添加的模型实例,所以我确实需要以某种方式将它们存储在服务器端(而不是存储在cookie或类似的东西中)
解决方案:
最后,我使用django过滤器生成过滤器表单,然后获取其查询数据,将其转换为json并保存到数据库中。
在此之后,我可以反序列化该字段,并在过滤器集中再次使用它。一个我无法用常规方法解决的问题是在我的FilterSet中测试单个模型(当模型已获取并且我需要测试时,它与筛选器匹配),所以我最终手动完成了测试(通过检查模型上的每个筛选器条件)。您确定这是您真正想要做的吗?您的最终用户是否知道过滤器是什么,或者如何格式化过滤器 我建议您查看Django过滤器库()
它将使您能够为Django模型创建过滤器,然后帮助您在UI中将过滤器呈现为表单。我实际上已经使用了Django过滤器。有没有办法用它来提取过滤数据?问题是,我真的需要以这样或那样的方式在数据库中存储过滤器。系统的另一部分将使用它们过滤新添加的模型实例(通过API或使用芹菜),因此我不仅需要渲染过滤器或将其应用于queryset(django过滤器做得非常好),还需要以某种方式存储它。