Skip to content

Commit 8d3f932

Browse files
committed
Merge pull request django#494 from mrj0/model_split
model_split: Fixed django#19236 - fixed error for abstract models with a split method
2 parents b98083c + 088f682 commit 8d3f932

File tree

3 files changed

+34
-9
lines changed

3 files changed

+34
-9
lines changed

django/db/models/fields/related.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,16 @@ class MyModel(Model):
5454

5555
else:
5656
# Look for an "app.Model" relation
57-
try:
58-
app_label, model_name = relation.split(".")
59-
except ValueError:
60-
# If we can't split, assume a model in current app
61-
app_label = cls._meta.app_label
62-
model_name = relation
63-
except AttributeError:
64-
# If it doesn't have a split it's actually a model class
57+
58+
if isinstance(relation, six.string_types):
59+
try:
60+
app_label, model_name = relation.split(".")
61+
except ValueError:
62+
# If we can't split, assume a model in current app
63+
app_label = cls._meta.app_label
64+
model_name = relation
65+
else:
66+
# it's actually a model class
6567
app_label = relation._meta.app_label
6668
model_name = relation._meta.object_name
6769

tests/regressiontests/m2m_regress/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,20 @@ class Worksheet(models.Model):
6161
class User(models.Model):
6262
name = models.CharField(max_length=30)
6363
friends = models.ManyToManyField(auth.User)
64+
65+
66+
class BadModelWithSplit(models.Model):
67+
name = models.CharField(max_length=1)
68+
69+
def split(self):
70+
raise RuntimeError('split should not be called')
71+
72+
class Meta:
73+
abstract = True
74+
75+
76+
class RegressionModelSplit(BadModelWithSplit):
77+
"""
78+
Model with a split method should not cause an error in add_lazy_relation
79+
"""
80+
others = models.ManyToManyField('self')

tests/regressiontests/m2m_regress/tests.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.utils import six
66

77
from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild,
8-
SelfReferChildSibling, Worksheet)
8+
SelfReferChildSibling, Worksheet, RegressionModelSplit)
99

1010

1111
class M2MRegressionTests(TestCase):
@@ -90,3 +90,9 @@ def test_manager_class_caching(self):
9090
# Get same manager for different instances
9191
self.assertTrue(e1.topics.__class__ is e2.topics.__class__)
9292
self.assertTrue(t1.entry_set.__class__ is t2.entry_set.__class__)
93+
94+
def test_m2m_abstract_split(self):
95+
# Regression for #19236 - an abstract class with a 'split' method
96+
# causes a TypeError in add_lazy_relation
97+
m1 = RegressionModelSplit(name='1')
98+
m1.save()

0 commit comments

Comments
 (0)