diff options
| author | Alex Gaynor <alex.gaynor@gmail.com> | 2012-11-04 14:20:26 -0800 |
|---|---|---|
| committer | Alex Gaynor <alex.gaynor@rd.io> | 2012-11-04 14:21:49 -0800 |
| commit | 69a0c91c90a3c8f8d5913874aca918aecbe69410 (patch) | |
| tree | be57b653a6fbdd7b2425290b746152bb4e9dfd32 | |
| parent | 3bb8c6e1cdc1f400ebef1dc956c771bafd02dafd (diff) | |
[1.5.x]Merge pull request #494 from mrj0/model_split
model_split: Fixed #19236 - fixed error for abstract models with a split method
Backport of 8d3f932f18c75fcbb32cf3dd5998445d65b5db0f
| -rw-r--r-- | django/db/models/fields/related.py | 18 | ||||
| -rw-r--r-- | tests/regressiontests/m2m_regress/models.py | 17 | ||||
| -rw-r--r-- | tests/regressiontests/m2m_regress/tests.py | 8 |
3 files changed, 34 insertions, 9 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 80c62f85c4..e2947b0093 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -54,14 +54,16 @@ def add_lazy_relation(cls, field, relation, operation): else: # Look for an "app.Model" relation - try: - app_label, model_name = relation.split(".") - except ValueError: - # If we can't split, assume a model in current app - app_label = cls._meta.app_label - model_name = relation - except AttributeError: - # If it doesn't have a split it's actually a model class + + if isinstance(relation, six.string_types): + try: + app_label, model_name = relation.split(".") + except ValueError: + # If we can't split, assume a model in current app + app_label = cls._meta.app_label + model_name = relation + else: + # it's actually a model class app_label = relation._meta.app_label model_name = relation._meta.object_name diff --git a/tests/regressiontests/m2m_regress/models.py b/tests/regressiontests/m2m_regress/models.py index 7c1108456e..1a4a6df354 100644 --- a/tests/regressiontests/m2m_regress/models.py +++ b/tests/regressiontests/m2m_regress/models.py @@ -61,3 +61,20 @@ class Worksheet(models.Model): class User(models.Model): name = models.CharField(max_length=30) friends = models.ManyToManyField(auth.User) + + +class BadModelWithSplit(models.Model): + name = models.CharField(max_length=1) + + def split(self): + raise RuntimeError('split should not be called') + + class Meta: + abstract = True + + +class RegressionModelSplit(BadModelWithSplit): + """ + Model with a split method should not cause an error in add_lazy_relation + """ + others = models.ManyToManyField('self') diff --git a/tests/regressiontests/m2m_regress/tests.py b/tests/regressiontests/m2m_regress/tests.py index 92628c1825..c39d883de4 100644 --- a/tests/regressiontests/m2m_regress/tests.py +++ b/tests/regressiontests/m2m_regress/tests.py @@ -5,7 +5,7 @@ from django.test import TestCase from django.utils import six from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild, - SelfReferChildSibling, Worksheet) + SelfReferChildSibling, Worksheet, RegressionModelSplit) class M2MRegressionTests(TestCase): @@ -90,3 +90,9 @@ class M2MRegressionTests(TestCase): # Get same manager for different instances self.assertTrue(e1.topics.__class__ is e2.topics.__class__) self.assertTrue(t1.entry_set.__class__ is t2.entry_set.__class__) + + def test_m2m_abstract_split(self): + # Regression for #19236 - an abstract class with a 'split' method + # causes a TypeError in add_lazy_relation + m1 = RegressionModelSplit(name='1') + m1.save() |
