Как разрешить фильтры REST для полей, не относящихся к БД, в django
Моя проблема заключается в следующем:
Я работаю над проектом django, который имеет множество таблиц DB, представляющих множество различных объектов. Этот проект имеет GUI интерфейс, который в основном представляет собой таблицу, которая является грубым представлением каждой таблицы DB. Эта таблица, которую я взял из google images, может быть использована в качестве примера
В отличие от этой таблицы, моя имеет фильтры поверх каждого столбца, так что, например, вы можете ввести имя, которое вы ищете, и она покажет только соответствующие строки. Проблема начинается здесь - не все столбцы в GUI на самом деле являются столбцами в БД. Например, скажем, столбец "Location" не является столбцом БД, а является свойством модели django, как это
@property
def location(self):
return f"{self.city}, {self.state}"
Поэтому очевидно, что отправка на мой бэкенд django этого URL не будет работать просто так
https://mywebsite/api/people/?location__icontains=Chicago
Моим обходным решением для этого является переход к представлению и переопределение filter_queryset для обработки этого конкретного случая . Что-то вроде этого:
def filter_queryset(self, queryset):
if "location__icontains" in self.request.query_params:
filter = self.request.query_params["location__icontains"]
q = Q(city__icontains=filter ) | Q(state__icontains=filter)
queryset = queryset.filter(q)
Проблема в том, что это даже не охватывает все случаи, это работает только если пользовательский фильтр вводит либо город, либо штат, а не какую-то комбинацию типа "ago, IL" (предполагается, что в результатах будет "Chicago, IL"). Кроме того, у меня слишком много таких случаев, так как мы, разработчики, добавили тонны свойств или полей сериализатора к отображению в течение многих лет, и клиенты ожидают, что смогут фильтровать по ним. То, что я ищу, это в идеале идея для общей обработки всех этих случаев (возможно, фильтр по сериализованным записям, а не по строкам БД?)
Я пытался искать эту проблему во многих различных типах фраз, но не нашел решения. Пока что нам приходится реализовывать хак для каждого конкретного случая