Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在数据库中存储用户定义的筛选器_Django_Django Models - Fatal编程技术网

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过滤器做得非常好),还需要以某种方式存储它。