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()
Вернуться на верх