Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
DjangoRestFramework:在JsonField中搜索和排序元素_Json_Django_Django Rest Framework - Fatal编程技术网

DjangoRestFramework:在JsonField中搜索和排序元素

DjangoRestFramework:在JsonField中搜索和排序元素,json,django,django-rest-framework,Json,Django,Django Rest Framework,是否可以通过使用django_rest_框架创建自定义方法来搜索/排序JsonField中的字段 ---------------------------------------------------------------- | name | my_json_field | ---------------------------------------------------------------- | rec

是否可以通过使用django_rest_框架创建自定义方法来搜索/排序JsonField中的字段

----------------------------------------------------------------
| name      |               my_json_field                      |
---------------------------------------------------------------- 
| record_1  | {"field1": "A1", "field2": "A2", "field3": "A3"} | 
----------------------------------------------------------------
| record_2  | {"field1": "B2", "field2": "B1" }                |
----------------------------------------------------------------
| record_3  | {"field1": "C3", "field2": "C2", "field3": "C1"} |
----------------------------------------------------------------
以便:

  • 如果按我的字段->字段1=“A1”进行筛选,我得到:
  • 如果按my_json_field->field3对DESC排序,我得到:

我还没有测试过这一点,但希望它能为你指明正确的方向

第一个问题是Django能做什么-Django能在
JSONField
s上通过任意键转换进行过滤和排序吗?对于筛选。用于排序,而不是直接排序。通常,不能按变换排序,但是可以将这些变换注释到queryset,然后根据注释进行过滤。这提供了一个如何使用
JSONField
执行此操作的示例

第二个问题是DRF能做什么。查看代码时,
SearchFilter
并不严重依赖于模型元,因此在
searchu字段中使用键转换应该可以。如果没有,您可以尝试使用注释。与Django类似,OrderingFilter不支持转换,但支持注释。综上所述,类似于以下的方法应该可以奏效:

从rest\u框架导入视图集、过滤器
从django.contrib.postgres.fields.jsonb导入KeyTextTransform
从my_app.models导入MyModel
类MyModelViewSet(viewsets.ModelViewSet):
queryset=MyModel.objects\
.annotate(field1=KeyTextTransform('my_json_field','field1'))\
.annotate(field2=KeyTextTransform('my_json_field','field2'))\
.annotate(field3=KeyTextTransform('my_json_field','field3'))
过滤器\后端=[filters.SearchFilter,filters.OrderingFilter]
搜索字段=['field1'、'field2'、'field3']
排序_字段=['field1','field2','field3']

请注意,您不能仅通过单个字段进行显式搜索,所有搜索字段都会被搜索。为此,您需要使用类似于
django filter

的方法,我还没有测试过这一点,但希望能为您指明正确的方向

第一个问题是Django可以做什么-Django可以通过
JSONField
s上的任意键转换进行过滤和排序吗?用于过滤,。用于排序,而不是直接排序。通常,您不能通过转换进行排序,但是您可以将这些转换注释到queryset,然后根据注释进行过滤。这提供了一个如何做到这一点的示例使用
JSONField

第二个问题是DRF可以做什么。通过查看代码,
SearchFilter
并不严重依赖模型元,因此在
search\u字段中使用键转换应该可以。如果不支持,您可以尝试使用注释。与Django类似,
OrderingFilter
不支持转换,但它确实支持支持注释。将其放在一起,类似于以下的内容应该可以工作:

从rest\u框架导入视图集、过滤器
从django.contrib.postgres.fields.jsonb导入KeyTextTransform
从my_app.models导入MyModel
类MyModelViewSet(viewsets.ModelViewSet):
queryset=MyModel.objects\
.annotate(field1=KeyTextTransform('my_json_field','field1'))\
.annotate(field2=KeyTextTransform('my_json_field','field2'))\
.annotate(field3=KeyTextTransform('my_json_field','field3'))
过滤器\后端=[filters.SearchFilter,filters.OrderingFilter]
搜索字段=['field1'、'field2'、'field3']
排序_字段=['field1','field2','field3']

请注意,您不能仅通过一个字段显式搜索,所有搜索字段都会被搜索。要做到这一点,您需要使用类似于
django filter

的工具。非常感谢您,我能够完成我想要的任务!我今天之前不知道注释,因为django 3使用了django.db.models.fields.json.KeyTextTransform非常感谢您,我现在使用了因为我能做我想做的!今天之前我不知道注释,因为Django 3使用Django.db.models.fields.json.KeyTextTransform
----------------------------------------------------------------
| name      |               my_json_field                      |
---------------------------------------------------------------- 
| record_1  | {"field1": "A1", "field2": "A2", "field3": "A3"} | 
----------------------------------------------------------------
----------------------------------------------------------------
| name      |               my_json_field                      |
----------------------------------------------------------------
| record_3  | {"field1": "C3", "field2": "C2", "field3": "C1"} |
---------------------------------------------------------------- 
| record_1  | {"field1": "A1", "field2": "A2", "field3": "A3"} | 
----------------------------------------------------------------
| record_2  | {"field1": "B2", "field2": "B1" }                |
----------------------------------------------------------------