[1.5.x]Merge pull request #494 from mrj0/model_split

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

Backport of 8d3f932f18
This commit is contained in:
Alex Gaynor 2012-11-04 14:20:26 -08:00 committed by Alex Gaynor
parent 3bb8c6e1cd
commit 69a0c91c90
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, six.string_types):
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()