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