DjangoRestFramework: поиск и сортировка элемента внутри JsonField - PullRequest
0 голосов
/ 09 мая 2019

Можно ли как-то найти / отсортировать поле внутри JsonField, создав собственный метод с использованием django_rest_framework?

----------------------------------------------------------------
| 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"} |
----------------------------------------------------------------

Так что:

  • если фильтр по my_json_field -> field1 = "A1", я получаю:
----------------------------------------------------------------
| name      |               my_json_field                      |
---------------------------------------------------------------- 
| record_1  | {"field1": "A1", "field2": "A2", "field3": "A3"} | 
----------------------------------------------------------------
  • если отсортировать DESC по my_json_field -> field3, я получу:
----------------------------------------------------------------
| 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" }                |
----------------------------------------------------------------

1 Ответ

1 голос
/ 09 мая 2019

Я не проверял это, но, надеюсь, должен направить вас в правильном направлении.

Первый вопрос - что может сделать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...