|
12 | 12 | import rollbar
|
13 | 13 |
|
14 | 14 | # Django Imports
|
| 15 | +import django |
15 | 16 | from django.conf import settings
|
16 | 17 | from django.core.exceptions import ObjectDoesNotExist
|
17 | 18 | from django.db import models
|
@@ -562,24 +563,53 @@ def parse_dependency(model, dependency):
|
562 | 563 | return
|
563 | 564 | try:
|
564 | 565 | 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 | + ) |
573 | 577 |
|
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 |
579 | 610 | )
|
580 |
| - else: |
581 |
| - model = field.related.model |
582 |
| - related_name = field.related.field.name |
| 611 | + ) |
| 612 | + |
583 | 613 | path.insert(0, related_name)
|
584 | 614 | except Exception as e:
|
585 | 615 | raise Exception(
|
|
0 commit comments