[1.6.x] Fixed #20820 -- Model inheritance + m2m fixture loading regression

Tests by Tim Graham, report from jeroen.pulles@redslider.net.

Backport of 1ed77e7782 from master
This commit is contained in:
Anssi Kääriäinen 2013-08-20 16:23:25 +03:00
parent 3ae585b449
commit 2b1101a4a6
4 changed files with 36 additions and 1 deletions

View File

@ -989,7 +989,16 @@ class ForeignObject(RelatedField):
@staticmethod @staticmethod
def get_instance_value_for_fields(instance, fields): def get_instance_value_for_fields(instance, fields):
return tuple([getattr(instance, field.attname) for field in fields]) ret = []
for field in fields:
# Gotcha: in some cases (like fixture loading) a model can have
# different values in parent_ptr_id and parent's id. So, use
# instance.pk (that is, parent_ptr_id) when asked for instance.id.
if field.primary_key:
ret.append(instance.pk)
else:
ret.append(getattr(instance, field.attname))
return tuple(ret)
def get_attname_column(self): def get_attname_column(self):
attname, column = super(ForeignObject, self).get_attname_column() attname, column = super(ForeignObject, self).get_attname_column()

View File

@ -0,0 +1,10 @@
[
{
"pk": 1,
"model": "fixtures_regress.specialarticle",
"fields": {
"title": "Article Title 1",
"channels": []
}
}
]

View File

@ -70,6 +70,11 @@ class Article(models.Model):
ordering = ('id',) ordering = ('id',)
# Subclass of a model with a ManyToManyField for test_ticket_20820
class SpecialArticle(Article):
pass
# Models to regression test #11428 # Models to regression test #11428
@python_2_unicode_compatible @python_2_unicode_compatible
class Widget(models.Model): class Widget(models.Model):

View File

@ -431,6 +431,17 @@ class TestFixtures(TestCase):
self.assertTrue("No fixture 'this_fixture_doesnt_exist' in" in self.assertTrue("No fixture 'this_fixture_doesnt_exist' in" in
force_text(stdout_output.getvalue())) force_text(stdout_output.getvalue()))
def test_ticket_20820(self):
"""
Regression for ticket #20820 -- loaddata on a model that inherits
from a model with a M2M shouldn't blow up.
"""
management.call_command(
'loaddata',
'special-article.json',
verbosity=0,
)
class NaturalKeyFixtureTests(TestCase): class NaturalKeyFixtureTests(TestCase):