diff options
| author | Dustin Farris | 2014-01-13 11:47:44 -0500 |
|---|---|---|
| committer | Dustin Farris | 2014-01-13 11:47:44 -0500 |
| commit | b1b58762a3d84ac4cdc6553e8ed06983fd3502ca (patch) | |
| tree | 436141017e3da1eba0bf67296ca442553e318162 /rest_framework/serializers.py | |
| parent | 2332382b5109939238801e7d4c018455d159fe91 (diff) | |
| download | django-rest-framework-b1b58762a3d84ac4cdc6553e8ed06983fd3502ca.tar.bz2 | |
Move models.resolve_model to serializers._resolve_model
Diffstat (limited to 'rest_framework/serializers.py')
| -rw-r--r-- | rest_framework/serializers.py | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 6b31c304..0ea2cadb 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -13,14 +13,15 @@ response content is handled by parsers and renderers. from __future__ import unicode_literals import copy import datetime +import inspect import types from decimal import Decimal +from django.core.exceptions import ImproperlyConfigured from django.core.paginator import Page from django.db import models from django.forms import widgets from django.utils.datastructures import SortedDict from rest_framework.compat import get_concrete_model, six -from rest_framework.models import resolve_model # Note: We do the following so that users of the framework can use this style: # @@ -33,6 +34,27 @@ from rest_framework.relations import * from rest_framework.fields import * +def _resolve_model(obj): + """ + Resolve supplied `obj` to a Django model class. + + `obj` must be a Django model class itself, or a string + representation of one. Useful in situtations like GH #1225 where + Django may not have resolved a string-based reference to a model in + another model's foreign key definition. + + String representations should have the format: + 'appname.ModelName' + """ + if type(obj) == str and len(obj.split('.')) == 2: + app_name, model_name = obj.split('.') + return models.get_model(app_name, model_name) + elif inspect.isclass(obj) and issubclass(obj, models.Model): + return obj + else: + raise ValueError("{0} is not a Django model".format(obj)) + + def pretty_name(name): """Converts 'first_name' to 'First name'""" if not name: @@ -657,7 +679,10 @@ class ModelSerializer(Serializer): if model_field.rel: to_many = isinstance(model_field, models.fields.related.ManyToManyField) - related_model = resolve_model(model_field.rel.to) + try: + related_model = _resolve_model(model_field.rel.to) + except ValueError as error_message: + raise ImproperlyConfigured(error_message) if to_many and not model_field.rel.through._meta.auto_created: has_through_model = True |
