From fcd3d4c68f06748c754c08eada526b678741e8c5 Mon Sep 17 00:00:00 2001 From: Mike Johnson 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 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: