Skip to content

Commit 6f3a16f

Browse files
committed
Fix retrieving model for reverse relations
1 parent 9ccf24c commit 6f3a16f

File tree

5 files changed

+20
-10
lines changed

5 files changed

+20
-10
lines changed

.idea/drf-yasg.iml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/drf_yasg/inspectors/field.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
import inspect
3+
import itertools
34
import logging
45
import operator
56
import sys
@@ -223,15 +224,23 @@ def get_related_model(model, source):
223224
:param str source: related field name
224225
:return: related model or ``None``
225226
"""
227+
descriptor = model
226228
try:
227-
descriptor = getattr(model, source)
228-
try:
229-
return descriptor.rel.related_model
230-
except Exception:
231-
return descriptor.field.remote_field.model
232-
except Exception: # pragma: no cover
229+
for attr in source.split('.'):
230+
descriptor = getattr(descriptor, attr)
231+
except AttributeError: # pragma: no cover
233232
return None
234233

234+
try:
235+
is_forward = descriptor.field in itertools.chain(model._meta.fields, model._meta.many_to_many)
236+
except AttributeError: # pragma: no cover
237+
return None
238+
239+
if is_forward:
240+
return descriptor.field.related_model
241+
else:
242+
return descriptor.field.model
243+
235244

236245
class RelatedFieldInspector(FieldInspector):
237246
"""Provides conversions for ``RelatedField``\\ s."""

tests/test_schema_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
from django.contrib.postgres import fields as postgres_fields
88
from django.db import models
99
from django.utils.inspect import get_func_args
10-
from django_fake_model import models as fake_models
1110
from rest_framework import routers, serializers, viewsets
1211
from rest_framework.decorators import api_view
1312
from rest_framework.response import Response
1413

14+
from django_fake_model import models as fake_models
1515
from drf_yasg import codecs, openapi
1616
from drf_yasg.codecs import yaml_sane_load
1717
from drf_yasg.errors import SwaggerGenerationError

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ skip_install = true
5555
deps =
5656
-r requirements/lint.txt
5757
commands =
58+
isort --recursive src tests
5859
flake8 src/drf_yasg testproj tests setup.py
5960

6061
[testenv:docs]

0 commit comments

Comments
 (0)