Django rest fraemwork. Фильтрация данных в соответствии с моделью в моделях отношений
У меня есть несколько моделей, таких как:
class MainModel(TimeStampedModel):
model_name = models.CharField(_("model_name"), max_length=240)
model_price = models.DecimalField(_("model_price"), max_digits=8)
class ModelAdditionalData_1(TimeStampedModel):
model_id = models.OneToOneField(
Model,
verbose_name=_('related model'),
on_delete=models.CASCADE,
related_name='model_water_flow_data1',
related_query_name='model_water_flow_data1'
)
model_param_1 = models.models.DecimalField(_("model_param_1"), max_digits=8)
class ModelAdditionalData_2(TimeStampedModel):
model_id = models.OneToOneField(
Model,
verbose_name=_('related model'),
on_delete=models.CASCADE,
related_name='model_water_flow_data2',
related_query_name='model_water_flow_data2'
)
model_param_2 = models.models.DecimalField(_("model_param_2"), max_digits=8)
urls.py
details_router = SimpleRouter()
details_router.register('models', DetailViewSet, 'models')
urlpatterns = details_router.urls
views.py
DETAIL_FILTER_PARAMETERS = [
openapi.Parameter(
'model_param_1',
openapi.IN_QUERY,
type=openapi.TYPE_STRING,
format=openapi.FORMAT_DECIMAL
),
openapi.Parameter(
'model_param_2',
openapi.IN_QUERY,
type=openapi.TYPE_STRING,
format=openapi.FORMAT_DECIMAL
)
]
@method_decorator(name='list', decorator=swagger_auto_schema(
manual_parameters=DETAIL_FILTER_PARAMETERS))
class ModelsViewSet(ReadOnlyModelViewSet, GenericViewSet):
serializer_class = ModelsSerializer
def list(self, request, *args, **kwargs):
....
Вот запрос с параметрами для фильтрации:
curl -X GET "http://localhost:8000/api/v1/models/?model_param_1=1&model_param_2=2" -H "accept: application/json"
Как я могу отфильтровать модель Model по данным в моделях отношений ModelAdditionalData_1 и ModelAdditionalData_2 с параметрами запроса и вернуть json только с записями, которые соответствуют фильтру?
С помощью Django ORM вы можете фильтровать объекты на основе значений их атрибутов отношений
Вы можете переопределить метод get_queryset()
вашего набора представлений для фильтрации параметров:
def get_queryset(self):
model_param_1 = self.request.query_params.get('model_param_1')
model_param_2 = self.request.query_params.get('model_param_2')
filters = {}
if model_param_1:
filters['model_water_flow_data1__model_param_1'] = model_param_1
if model_param_2:
filters['model_water_flow_data2__model_param_2'] = model_param_2
if filters:
return MainModel.objects.filter(**filters)
return MainModel.objects.all()