使用_contains过滤大于,小于和范围的JSON字段django

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用_contains过滤大于,小于和范围的JSON字段django相关的知识,希望对你有一定的参考价值。

让我们说我有这个模型:

class Item(models.Model):
    data = JSONField(blank=True, null=True)

然后在控制台中:

>>Item.objects.create(data={'size': 11})
>>Item.objects.create(data={'size': 12})
>>Item.objects.create(data={'size': 13})

如何过滤传递JSON数据的结果如下,但是数字范围内的大小是大于还是小于数字?

Item.objects.filter(data__contains={'size': *match this numbers*})

或者有没有其他方法不使用data__size__gte所以我可以创建JSON变量并自由过滤它们。

答案

如果您正在使用Postgres和最新版本的Django,可以使用JSONField中的contib.postgres.fields完成:

Item.objects.filter(data__size=12)

文件:https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#querying-jsonfield

如果您的查询变得更复杂,我会使用相关模型而不是JSONField,因此您可以使用ORM。

另一答案

所以我前一段时间解决了这个问题,通知记得我这个问题。解决方案很简单。 Yo可以创建一个函数,生成一个参数字典以传递给过滤函数。在我的项目中,我使用json字段根据类别保存产品的一些数据,因此对于不同的类别,我创建了不同的表单。

假设我有一个名为计算机的类别,我想根据ram的大小过滤“计算机”类别中的产品。

dict_of_parameters = {"attributes__ram__gte": 2, "attributes__ram__lte": 8}
items = Product.objects.filter(**dict_of_parameters)  #  The ** operator will pass the dictionary as parameters to the function

提示:

要生成参数字典,您有很多选择。在我的例子中,我在类别中有一个字段,其中包含用于生成项目和过滤项目的字段字典。一个json字段,类似于

some_category.attributes = {"fields":
                                   {
                                    "ram":
                                         {
                                          "type": "number",
                                          "filter_by": ["gte", "lte"]
                                         }
                                    "CPU":
                                         {
                                          "type": "select",
                                          "options": ["I3", "I5", "I7"]
                                         }
                                   }
                            }

但是,您不必将其保存在数据库中,您可以将其保存在json文件或任何您想要的内容中。从这里,您可以创建一个函数,从该字段生成一个表单,并使用它生成字典以传递给过滤器函数。

这使您可以灵活地在Postgre数据库中以json格式保存数据并过滤该数据,即使您不知道字段名称或创建新字段也是如此。

以上是关于使用_contains过滤大于,小于和范围的JSON字段django的主要内容,如果未能解决你的问题,请参考以下文章

django中models的filter过滤方法

将 drupal 视图过滤器从大于更改为小于

如何过滤具有大于和小于运算符的grafana仪表板?

确定范围重叠,包括小于和大于范围

ES-DSL基本使用

Django常用的QuerySet操作