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

时间:2019-03-17 15:51:23

标签: 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=_('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用于使用OR条件进行过滤。

UPD2: 用户定义的过滤器将由系统的另一部分用来过滤新添加的模型实例,因此,我确实需要以某种方式将它们存储在服务器端(而不是存储在cookie或类似的东西中)。

解决方案: 最后,我使用django-filter生成过滤器表单,然后获取它的查询数据,转换为json并将其保存到数据库中。 之后,我可以反序列化该字段,然后在我的FilterSet中再次使用它。我无法以正常方式解决的一个问题是在FilterSet中测试单个模型(当已经获取模型并且需要测试时,它与过滤器匹配),所以我最终手动完成了(通过检查每个过滤器条件)型号)。

1 个答案:

答案 0 :(得分:1)

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

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

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