使用_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的主要内容,如果未能解决你的问题,请参考以下文章