diff --git a/src/dso_api/dynamic_api/filters/parser.py b/src/dso_api/dynamic_api/filters/parser.py index f8ed7c0d5..89d33d929 100644 --- a/src/dso_api/dynamic_api/filters/parser.py +++ b/src/dso_api/dynamic_api/filters/parser.py @@ -417,6 +417,16 @@ def _translate_raw_value( # noqa: C901 # or ?ligtInPanden=... references their identifier as foreign key. return filter_input.raw_value + if field_schema.is_array_of_objects: + try: + items = field_schema["items"] + parser = SCALAR_PARSERS[items.get("format") or items["type"]] + except KeyError as e: + raise ValidationError( + f"Array of objects field '{filter_part.name}' " + f"should be filtered on with a .subfield" + ) from e + if field_schema.is_array: items = field_schema["items"] parser = SCALAR_PARSERS[items.get("format") or items["type"]] diff --git a/src/tests/test_dynamic_api/views/test_api_filters.py b/src/tests/test_dynamic_api/views/test_api_filters.py index 22e80dc9f..d2b1afb53 100644 --- a/src/tests/test_dynamic_api/views/test_api_filters.py +++ b/src/tests/test_dynamic_api/views/test_api_filters.py @@ -20,6 +20,19 @@ def test_no_such_field(api_client, afval_dataset, filled_router): reason = response.data["invalid-params"][0]["reason"] assert reason == "Field 'nonexistent' does not exist" + @staticmethod + def test_array_of_objects_field(api_client, bag_dataset, filled_router): + """Prove that not filtering on a subfield of an array of objects will crash.""" + response = api_client.get("/v1/bag/verblijfsobjecten/?gebruiksdoel=test") + data = read_response_json(response) + + assert response.status_code == HTTP_400_BAD_REQUEST, data + reason = data["invalid-params"][0]["reason"] + assert ( + reason + == "Array of objects field 'gebruiksdoel' should be filtered on with a .subfield" + ) + @staticmethod @pytest.mark.parametrize( "url",