Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge pull request #494 from mrj0/model_split

model_split: Fixed #19236 - fixed error for abstract models with a split method
  • Loading branch information...
commit 8d3f932f18c75fcbb32cf3dd5998445d65b5db0f 2 parents b98083c + 088f682
Alex Gaynor alex authored
18 django/db/models/fields/related.py
View
@@ -54,14 +54,16 @@ class MyModel(Model):
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
17 tests/regressiontests/m2m_regress/models.py
View
@@ -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')
8 tests/regressiontests/m2m_regress/tests.py
View
@@ -5,7 +5,7 @@
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 @@ def test_manager_class_caching(self):
# 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()
Please sign in to comment.
Something went wrong with that request. Please try again.