Commit 8d3f932f authored by Alex Gaynor's avatar Alex Gaynor
Browse files

Merge pull request #494 from mrj0/model_split

model_split: Fixed #19236 - fixed error for abstract models with a split method
parents b98083ce 088f6825
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -54,14 +54,16 @@ def add_lazy_relation(cls, field, relation, operation):

    else:
        # Look for an "app.Model" relation

        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
        except AttributeError:
            # If it doesn't have a split it's actually a model class
        else:
            # it's actually a model class
            app_label = relation._meta.app_label
            model_name = relation._meta.object_name

+17 −0
Original line number Diff line number Diff line
@@ -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')
+7 −1
Original line number Diff line number Diff line
@@ -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()