diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 7a0aea3db..e4cb69542 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -202,3 +202,18 @@ def template_render(template, context=None, request=None): # backends template, e.g. django.template.backends.django.Template else: return template.render(context, request=request) + +def get_remote_field(field): + """ + Django 1.9 removed usage of Rel objects, see + https://github.com/django/django/pull/4241 + + :param field: Field + :return: remote field + """ + from django.db.models import fields + + if django.VERSION < (1, 9): + return field.rel + else: + return field.remote_field \ No newline at end of file diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py index c3424a679..8859cb59c 100644 --- a/rest_framework/utils/model_meta.py +++ b/rest_framework/utils/model_meta.py @@ -12,6 +12,7 @@ from django.apps import apps from django.core.exceptions import ImproperlyConfigured from django.db import models from django.utils import six +from rest_framework.compat import get_remote_field FieldInfo = namedtuple('FieldResult', [ 'pk', # Model field instance @@ -76,9 +77,10 @@ def get_field_info(model): def _get_pk(opts): pk = opts.pk - while pk.rel and pk.rel.parent_link: + remote_field = get_remote_field(pk) + while remote_field and remote_field.parent_link: # If model is a child via multi-table inheritance, use parent's pk. - pk = pk.rel.to._meta.pk + pk = remote_field.to._meta.pk return pk