Я не проверял это, но, надеюсь, должен направить вас в правильном направлении.
Первый вопрос - что может сделать Django - может ли Django фильтровать и сортировать по произвольным преобразованиям ключей на JSONField
s? Для фильтрации абсолютно . Для сортировки, а не напрямую. Как правило, вы не можете сортировать по преобразованиям, однако вы можете аннотировать эти преобразования в набор запросов, а затем фильтровать аннотации. Этот ответ предоставляет пример того, как сделать это с JSONField
.
Второй вопрос: что может сделать DRF? Просматривая код, SearchFilter
не сильно зависит от мета-модели, поэтому использование преобразования ключей в search_fields
должно быть хорошо. Если нет, вы можете попробовать аннотацию вместо этого. Подобно Django, OrderingFilter
не поддерживает преобразования, но поддерживает аннотации. Если сложить это вместе, должно получиться что-то вроде следующего:
from rest_framework import viewsets, filters
from django.contrib.postgres.fields.jsonb import KeyTextTransform
from my_app.models import MyModel
class 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')
filter_backends = [filters.SearchFilter, filters.OrderingFilter]
search_fields = ['field1', 'field2', 'field3']
ordering_fields = ['field1', 'field2', 'field3']
Обратите внимание, что вы не можете явно искать только по одному полю, все поля поиска ищутся. Для этого вам нужно использовать что-то вроде django-filter
.