model_split: Fixed #19236 - fixed error for abstract models with a split method

This commit is contained in:
Mike Johnson 2012-11-04 13:43:54 -08:00
parent 3e9b36688d
commit fcd3d4c68f
3 changed files with 34 additions and 9 deletions

View File

@ -54,14 +54,16 @@ def add_lazy_relation(cls, field, relation, operation):
else: else:
# Look for an "app.Model" relation # Look for an "app.Model" relation
try:
app_label, model_name = relation.split(".") if isinstance(relation, basestring):
except ValueError: try:
# If we can't split, assume a model in current app app_label, model_name = relation.split(".")
app_label = cls._meta.app_label except ValueError:
model_name = relation # If we can't split, assume a model in current app
except AttributeError: app_label = cls._meta.app_label
# If it doesn't have a split it's actually a model class model_name = relation
else:
# it's actually a model class
app_label = relation._meta.app_label app_label = relation._meta.app_label
model_name = relation._meta.object_name model_name = relation._meta.object_name

View File

@ -61,3 +61,20 @@ class Worksheet(models.Model):
class User(models.Model): class User(models.Model):
name = models.CharField(max_length=30) name = models.CharField(max_length=30)
friends = models.ManyToManyField(auth.User) 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')

View File

@ -5,7 +5,7 @@ from django.test import TestCase
from django.utils import six from django.utils import six
from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild, from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild,
SelfReferChildSibling, Worksheet) SelfReferChildSibling, Worksheet, RegressionModelSplit)
class M2MRegressionTests(TestCase): class M2MRegressionTests(TestCase):
@ -90,3 +90,9 @@ class M2MRegressionTests(TestCase):
# Get same manager for different instances # Get same manager for different instances
self.assertTrue(e1.topics.__class__ is e2.topics.__class__) self.assertTrue(e1.topics.__class__ is e2.topics.__class__)
self.assertTrue(t1.entry_set.__class__ is t2.entry_set.__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()