diff --git a/tastypie/resources.py b/tastypie/resources.py index 35dfc909a..33050ddf3 100644 --- a/tastypie/resources.py +++ b/tastypie/resources.py @@ -1781,8 +1781,12 @@ def get_multiple(self, request, **kwargs): class ModelDeclarativeMetaclass(DeclarativeMetaclass): def __new__(cls, name, bases, attrs): meta = attrs.get('Meta') + # Sanity check: ModelResource needs either a queryset or object_class: + if meta and not hasattr(meta, 'queryset') and not hasattr(meta, 'object_class'): + msg = "ModelResource (%s) requires Meta.object_class or Meta.queryset" + raise ImproperlyConfigured(msg % name) - if meta and hasattr(meta, 'queryset'): + if hasattr(meta, 'queryset') and not hasattr(meta, 'object_class'): setattr(meta, 'object_class', meta.queryset.model) new_class = super(ModelDeclarativeMetaclass, cls).__new__(cls, name, bases, attrs) diff --git a/tests/core/tests/resources.py b/tests/core/tests/resources.py index 9cb7586fd..00ddac10e 100644 --- a/tests/core/tests/resources.py +++ b/tests/core/tests/resources.py @@ -16,7 +16,7 @@ from django import forms from django.contrib.auth import get_user_model from django.core.cache import cache -from django.core.exceptions import FieldError, MultipleObjectsReturned, ObjectDoesNotExist +from django.core.exceptions import FieldError, MultipleObjectsReturned, ObjectDoesNotExist, ImproperlyConfigured from django.core import mail try: from django.urls import reverse @@ -1609,6 +1609,16 @@ def test_fields(self): self.assertEqual(annr.fields['updated'].readonly, False) self.assertEqual(annr.fields['updated'].unique, False) + def test_invalid_model_resource(self): + """ + Test error message regarding ModelResource lacking object_class and queryset. + """ + with self.assertRaises(ImproperlyConfigured) as exception_context: + class InvalidNoteResource(ModelResource): + class Meta: + resource_name = 'invalidnotes' + self.assertTrue('InvalidNoteResource' in str(exception_context.exception)) + def test_fields__empty_list(self): class EmptyFieldsNoteResource(ModelResource): class Meta: @@ -1627,7 +1637,7 @@ class Meta: object_class = Note class EmptyFieldsNoteResource(FieldsNotSpecifiedNoteResource): - class Meta: + class Meta(FieldsNotSpecifiedNoteResource.Meta): resource_name = 'emptyfieldsnotes' fields = []