Skip to content

Commit f30f25f

Browse files
committed
Merge pull request #3656 from andreif/fix/deprecated-related
Fix #3252 -- Use related_objects api for Django 1.9+
2 parents f3de214 + 2acc6a7 commit f30f25f

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

rest_framework/compat.py

+29
Original file line numberDiff line numberDiff line change
@@ -230,3 +230,32 @@ def template_render(template, context=None, request=None):
230230
# backends template, e.g. django.template.backends.django.Template
231231
else:
232232
return template.render(context, request=request)
233+
234+
235+
def get_all_related_objects(opts):
236+
"""
237+
Django 1.8 changed meta api, see
238+
https://docs.djangoproject.com/en/1.8/ref/models/meta/#migrating-old-meta-api
239+
https://code.djangoproject.com/ticket/12663
240+
https://github.com/django/django/pull/3848
241+
242+
:param opts: Options instance
243+
:return: list of relations except many-to-many ones
244+
"""
245+
if django.VERSION < (1, 9):
246+
return opts.get_all_related_objects()
247+
else:
248+
return [r for r in opts.related_objects if not r.field.many_to_many]
249+
250+
251+
def get_all_related_many_to_many_objects(opts):
252+
"""
253+
Django 1.8 changed meta api, see docstr in compat.get_all_related_objects()
254+
255+
:param opts: Options instance
256+
:return: list of many-to-many relations
257+
"""
258+
if django.VERSION < (1, 9):
259+
return opts.get_all_related_many_to_many_objects()
260+
else:
261+
return [r for r in opts.related_objects if r.field.many_to_many]

rest_framework/utils/model_meta.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
from django.db import models
1414
from django.utils import six
1515

16+
from rest_framework.compat import (
17+
get_all_related_many_to_many_objects, get_all_related_objects
18+
)
19+
1620
FieldInfo = namedtuple('FieldResult', [
1721
'pk', # Model field instance
1822
'fields', # Dict of field name -> model field instance
@@ -134,7 +138,7 @@ def _get_reverse_relationships(opts):
134138
# See: https://code.djangoproject.com/ticket/24208
135139

136140
reverse_relations = OrderedDict()
137-
for relation in opts.get_all_related_objects():
141+
for relation in get_all_related_objects(opts):
138142
accessor_name = relation.get_accessor_name()
139143
related = getattr(relation, 'related_model', relation.model)
140144
reverse_relations[accessor_name] = RelationInfo(
@@ -146,7 +150,7 @@ def _get_reverse_relationships(opts):
146150
)
147151

148152
# Deal with reverse many-to-many relationships.
149-
for relation in opts.get_all_related_many_to_many_objects():
153+
for relation in get_all_related_many_to_many_objects(opts):
150154
accessor_name = relation.get_accessor_name()
151155
related = getattr(relation, 'related_model', relation.model)
152156
reverse_relations[accessor_name] = RelationInfo(

0 commit comments

Comments
 (0)