[1.7.x] Fixed #22421 -- Regression in fixtures loading.

Loading fixtures were failing since the refactoring in 244e2b71f5 for
inheritance setups where the chain contains abstract models and the
root ancestor contains a M2M relation.

Thanks Stanislas Guerra for the report.

Refs #20946.

Backport of 862e1ff234 from master
This commit is contained in:
Ramiro Morales 2014-05-12 13:46:47 -03:00 committed by Tim Graham
parent 485163f72c
commit fb45e666c2
4 changed files with 45 additions and 3 deletions

View File

@ -1426,14 +1426,16 @@ class ForeignObject(RelatedField):
@staticmethod
def get_instance_value_for_fields(instance, fields):
ret = []
opts = instance._meta
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.
opts = instance._meta
if field.primary_key:
possible_parent_link = opts.get_ancestor_link(field.model)
if not possible_parent_link or possible_parent_link.primary_key:
if (not possible_parent_link or
possible_parent_link.primary_key or
possible_parent_link.model._meta.abstract):
ret.append(instance.pk)
continue
ret.append(getattr(instance, field.attname))

View File

@ -0,0 +1,17 @@
[
{
"fields": {
"channels": [],
"title": "Title of this feature article"
},
"model": "fixtures_regress.article",
"pk": 1
},
{
"fields": {
"channels": []
},
"model": "fixtures_regress.feature",
"pk": 1
}
]

View File

@ -52,7 +52,7 @@ class Child(Parent):
data = models.CharField(max_length=10)
# Models to regression test #7572
# Models to regression test #7572, #20820
class Channel(models.Model):
name = models.CharField(max_length=255)
@ -70,6 +70,17 @@ class SpecialArticle(Article):
pass
# Models to regression test #22421
class CommonFeature(Article):
class Meta:
abstract = True
class Feature(CommonFeature):
pass
# Models to regression test #11428
@python_2_unicode_compatible
class Widget(models.Model):

View File

@ -480,6 +480,18 @@ class TestFixtures(TestCase):
verbosity=0,
)
def test_ticket_22421(self):
"""
Regression for ticket #22421 -- loaddata on a model that inherits from
a grand-parent model with a M2M but via an abstract parent shouldn't
blow up.
"""
management.call_command(
'loaddata',
'feature.json',
verbosity=0,
)
class NaturalKeyFixtureTests(TestCase):