Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 2 commits into from Nov 4, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 10 additions & 8 deletions django/db/models/fields/related.py
Expand Up @@ -54,14 +54,16 @@ class MyModel(Model):

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, 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
else:
# it's actually a model class
app_label = relation._meta.app_label
model_name = relation._meta.object_name

Expand Down
17 changes: 17 additions & 0 deletions tests/regressiontests/m2m_regress/models.py
Expand Up @@ -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')
8 changes: 7 additions & 1 deletion tests/regressiontests/m2m_regress/tests.py
Expand Up @@ -5,7 +5,7 @@
from django.utils import six

from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild,
SelfReferChildSibling, Worksheet)
SelfReferChildSibling, Worksheet, RegressionModelSplit)


class M2MRegressionTests(TestCase):
Expand Down Expand Up @@ -90,3 +90,9 @@ def test_manager_class_caching(self):
# 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()