我需要允许用户为我的某个模型创建和存储过滤器。我想出的唯一正确的想法是这样的:
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)
所以filter字段存储一个字符串,如:{"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
用于过滤OR条件。
UPD2:系统的另一部分将使用用户定义的过滤器来过滤新添加的模型实例,因此我确实需要以某种方式将它们存储在服务器端(不是在cookie或类似的东西中)。
解决方案:最后,我使用django-filter生成过滤器表单,然后抓取它的查询数据,转换为json并将其保存到数据库。之后,我可以反序列化该字段并再次在我的FilterSet中使用它。我无法以正常方式解决的一个问题是在我的FilterSet中测试单个模型(当模型已经被提取并且我需要测试时,它匹配过滤器)所以我最终手动完成(通过检查每个过滤条件)模型)。
你确定这实际上是你想做的吗?您的最终用户是否会知道过滤器是什么,或者如何格式化过滤器?
我建议您查看Django过滤器库(https://django-filter.readthedocs.io/)。
它将使您能够为Django模型创建过滤器,然后帮助您将过滤器呈现为UI中的表单。