summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamiro Morales <cramm0@gmail.com>2014-05-12 13:46:47 -0300
committerTim Graham <timograham@gmail.com>2014-05-22 07:38:39 -0400
commitfb45e666c204d7188c38469ca1f661a9b113b85b (patch)
tree1523abf4dabd6ab8e627fd14041464f7a94f870a
parent485163f72cf916231fbef78a645a19dfa34928b2 (diff)
[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
-rw-r--r--django/db/models/fields/related.py6
-rw-r--r--tests/fixtures_regress/fixtures/feature.json17
-rw-r--r--tests/fixtures_regress/models.py13
-rw-r--r--tests/fixtures_regress/tests.py12
4 files changed, 45 insertions, 3 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 21153dcbb8..5954cf35f4 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -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))
diff --git a/tests/fixtures_regress/fixtures/feature.json b/tests/fixtures_regress/fixtures/feature.json
new file mode 100644
index 0000000000..84aa2adcf4
--- /dev/null
+++ b/tests/fixtures_regress/fixtures/feature.json
@@ -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
+}
+]
diff --git a/tests/fixtures_regress/models.py b/tests/fixtures_regress/models.py
index 95f9488ab7..14f8829760 100644
--- a/tests/fixtures_regress/models.py
+++ b/tests/fixtures_regress/models.py
@@ -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):
diff --git a/tests/fixtures_regress/tests.py b/tests/fixtures_regress/tests.py
index 61fc66d928..f99bcbe378 100644
--- a/tests/fixtures_regress/tests.py
+++ b/tests/fixtures_regress/tests.py
@@ -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):