From fcd3d4c68f06748c754c08eada526b678741e8c5 Mon Sep 17 00:00:00 2001
From: Mike Johnson <mike@mrj0.com>
Date: Sun, 4 Nov 2012 13:43:54 -0800
Subject: [PATCH 1/2] model_split: Fixed #19236 - fixed error for abstract
 models with a split method

---
 django/db/models/fields/related.py          | 18 ++++++++++--------
 tests/regressiontests/m2m_regress/models.py | 17 +++++++++++++++++
 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 5c3f538018..5d82c5cbb1 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, basestring):
+            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()

From 088f68252d1f3c9e5d51a5ea3ab769397a65859f Mon Sep 17 00:00:00 2001
From: Mike Johnson <mike@mrj0.com>
Date: Sun, 4 Nov 2012 14:16:32 -0800
Subject: [PATCH 2/2] use six.string_types for python3

---
 django/db/models/fields/related.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 5d82c5cbb1..90fe69e23c 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -55,7 +55,7 @@ def add_lazy_relation(cls, field, relation, operation):
     else:
         # Look for an "app.Model" relation
 
-        if isinstance(relation, basestring):
+        if isinstance(relation, six.string_types):
             try:
                 app_label, model_name = relation.split(".")
             except ValueError: