[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:
parent
3bb8c6e1cd
commit
69a0c91c90
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue