将用户定义的过滤器存储在数据库中

问题描述 投票:1回答:1

我需要允许用户为我的某个模型创建和存储过滤器。我想出的唯一正确的想法是这样的:

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 django-models
1个回答
1
投票

你确定这实际上是你想做的吗?您的最终用户是否会知道过滤器是什么,或者如何格式化过滤器?

我建议您查看Django过滤器库(https://django-filter.readthedocs.io/)。

它将使您能够为Django模型创建过滤器,然后帮助您将过滤器呈现为UI中的表单。

© www.soinside.com 2019 - 2024. All rights reserved.