diff --git a/AUTHORS b/AUTHORS index 35d959c6..fa91e9b2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -15,6 +15,7 @@ Jamie Bliss Jason Housley Jeppe Fihl-Pearson Jerel Unruh +Jonas Kiefer Jonas Metzener Jonathan Senecal Joseba Mendivil diff --git a/CHANGELOG.md b/CHANGELOG.md index 10559ddb..1fa3d92e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ any parts of the framework not mentioned in the documentation should generally b * Raise comprehensible error when reserved field names `meta` and `results` are used. * Use `relationships` in the error object `pointer` when the field is actually a relationship. * Added missing inflection to the generated OpenAPI schema. +* Added missing error message when `resource_name` is not properly configured. ### Changed diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index 65cbc645..6189093f 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -320,7 +320,10 @@ def get_resource_type_from_serializer(serializer): return meta.resource_name elif hasattr(meta, "model"): return get_resource_type_from_model(meta.model) - raise AttributeError() + raise AttributeError( + f"can not detect 'resource_name' on serializer '{serializer.__class__.__name__}'" + f" in module '{serializer.__class__.__module__}'" + ) def get_included_resources(request, serializer=None): diff --git a/tests/test_utils.py b/tests/test_utils.py index 43c12dcf..d8810c0b 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,7 @@ import pytest from django.db import models from rest_framework import status +from rest_framework.fields import Field from rest_framework.generics import GenericAPIView from rest_framework.response import Response from rest_framework.views import APIView @@ -15,6 +16,7 @@ get_included_serializers, get_related_resource_type, get_resource_name, + get_resource_type_from_serializer, undo_format_field_name, undo_format_field_names, undo_format_link_segment, @@ -377,3 +379,17 @@ class Meta: } assert included_serializers == expected_included_serializers + + +def test_get_resource_type_from_serializer_without_resource_name_raises_error(): + class SerializerWithoutResourceName(serializers.Serializer): + something = Field() + + serializer = SerializerWithoutResourceName() + + with pytest.raises(AttributeError) as excinfo: + get_resource_type_from_serializer(serializer=serializer) + assert str(excinfo.value) == ( + "can not detect 'resource_name' on serializer " + "'SerializerWithoutResourceName' in module 'tests.test_utils'" + )