[1.7.x] Fixed #22421 -- Regression in fixtures loading.
Loading fixtures were failing since the refactoring in244e2b71f5
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 of862e1ff234
from master
This commit is contained in:
parent
485163f72c
commit
fb45e666c2
|
@ -1426,14 +1426,16 @@ class ForeignObject(RelatedField):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_instance_value_for_fields(instance, fields):
|
def get_instance_value_for_fields(instance, fields):
|
||||||
ret = []
|
ret = []
|
||||||
|
opts = instance._meta
|
||||||
for field in fields:
|
for field in fields:
|
||||||
# Gotcha: in some cases (like fixture loading) a model can have
|
# Gotcha: in some cases (like fixture loading) a model can have
|
||||||
# different values in parent_ptr_id and parent's id. So, use
|
# different values in parent_ptr_id and parent's id. So, use
|
||||||
# instance.pk (that is, parent_ptr_id) when asked for instance.id.
|
# instance.pk (that is, parent_ptr_id) when asked for instance.id.
|
||||||
opts = instance._meta
|
|
||||||
if field.primary_key:
|
if field.primary_key:
|
||||||
possible_parent_link = opts.get_ancestor_link(field.model)
|
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)
|
ret.append(instance.pk)
|
||||||
continue
|
continue
|
||||||
ret.append(getattr(instance, field.attname))
|
ret.append(getattr(instance, field.attname))
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
|
@ -52,7 +52,7 @@ class Child(Parent):
|
||||||
data = models.CharField(max_length=10)
|
data = models.CharField(max_length=10)
|
||||||
|
|
||||||
|
|
||||||
# Models to regression test #7572
|
# Models to regression test #7572, #20820
|
||||||
class Channel(models.Model):
|
class Channel(models.Model):
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
|
|
||||||
|
@ -70,6 +70,17 @@ class SpecialArticle(Article):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Models to regression test #22421
|
||||||
|
class CommonFeature(Article):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
class Feature(CommonFeature):
|
||||||
|
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):
|
||||||
|
|
|
@ -480,6 +480,18 @@ class TestFixtures(TestCase):
|
||||||
verbosity=0,
|
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):
|
class NaturalKeyFixtureTests(TestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue