Browse Source

Merge pull request #2679 from ramiro/t22421

Fixed #22421 -- Regression in fixtures loading.
Ramiro Morales 11 years ago
parent
commit
d731f48ece

+ 4 - 2
django/db/models/fields/related.py

@@ -1440,14 +1440,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))

+ 17 - 0
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
+}
+]

+ 12 - 1
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):

+ 12 - 0
tests/fixtures_regress/tests.py

@@ -486,6 +486,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):