Skip to content

Commit da54424

Browse files
authored
feat: ⚡️ Improve MP dependency parser for Django >=2 (#392)
1 parent 92be0b1 commit da54424

File tree

1 file changed

+46
-16
lines changed

1 file changed

+46
-16
lines changed

apps/mp/services.py

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import rollbar
1313

1414
# Django Imports
15+
import django
1516
from django.conf import settings
1617
from django.core.exceptions import ObjectDoesNotExist
1718
from django.db import models
@@ -562,24 +563,53 @@ def parse_dependency(model, dependency):
562563
return
563564
try:
564565
field = getattr(model, attr_name)
565-
# for ReverseSingleRelatedObjectDescriptor
566-
if hasattr(field, 'field'):
567-
is_reverse = field.__class__.__name__.startswith('Reverse')
568-
field = field.field
569-
model = field.rel.related_model if is_reverse else field.rel.to
570-
related_name = (
571-
field.name if is_reverse else field.rel.related_name
572-
)
566+
relation_class_name = field.__class__.__name__
567+
# django.VERSION is a tuple. First item is major version
568+
if django.VERSION[0] == 1:
569+
if hasattr(field, 'field'):
570+
# for ReverseSingleRelatedObjectDescriptor
571+
is_reverse = relation_class_name.startswith('Reverse')
572+
field = field.field
573+
model = field.rel.related_model if is_reverse else field.rel.to
574+
related_name = (
575+
field.name if is_reverse else field.rel.related_name
576+
)
573577

574-
if not related_name or related_name == '+':
575-
raise Exception(
576-
"Fields with no explicit related name aren't supported for now: {}".format(
577-
field
578-
)
578+
else:
579+
model = field.related.model
580+
related_name = field.related.field.name
581+
else: # Django version is >= 2 (Tested on Django 2.2.28, 3.2.22, 4.2.6)
582+
if relation_class_name == 'ForwardManyToOneDescriptor':
583+
model = field.field.related_model
584+
related_name = field.field.remote_field.related_name
585+
elif relation_class_name == 'ReverseManyToOneDescriptor':
586+
model = field.field.model
587+
related_name = field.field.name
588+
elif relation_class_name == 'ForwardOneToOneDescriptor':
589+
model = field.field.related_model
590+
related_name = field.field.remote_field.related_name
591+
elif relation_class_name == 'ReverseOneToOneDescriptor':
592+
model = field.related.related_model
593+
related_name = field.related.related_name
594+
elif relation_class_name == 'ManyToManyDescriptor':
595+
if field.reverse:
596+
model = field.field.related_model
597+
related_name = field.field.remote_field.related_name
598+
else:
599+
model = field.field.model
600+
related_name = field.field.name
601+
else:
602+
raise TypeError('Unknown relation Descriptor: `{}`'.format(
603+
relation_class_name
604+
))
605+
606+
if not related_name or related_name == '+':
607+
raise Exception(
608+
"Fields with no explicit related name aren't supported for now: {}".format(
609+
field
579610
)
580-
else:
581-
model = field.related.model
582-
related_name = field.related.field.name
611+
)
612+
583613
path.insert(0, related_name)
584614
except Exception as e:
585615
raise Exception(

0 commit comments

Comments
 (0)