diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2013-08-20 16:23:25 +0300 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2013-08-20 17:15:52 +0300 |
| commit | 2b1101a4a6acbf9350b62638a04edcf20ad83e97 (patch) | |
| tree | b26c1d1f7d1e1e593ee65deabd1c6b61513e342c | |
| parent | 3ae585b44977d0753a5e5f142b790716d6939258 (diff) | |
[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
| -rw-r--r-- | django/db/models/fields/related.py | 11 | ||||
| -rw-r--r-- | tests/fixtures_regress/fixtures/special-article.json | 10 | ||||
| -rw-r--r-- | tests/fixtures_regress/models.py | 5 | ||||
| -rw-r--r-- | tests/fixtures_regress/tests.py | 11 |
4 files changed, 36 insertions, 1 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 5c13205fbb..2813a39567 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -989,7 +989,16 @@ class ForeignObject(RelatedField): @staticmethod 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): attname, column = super(ForeignObject, self).get_attname_column() diff --git a/tests/fixtures_regress/fixtures/special-article.json b/tests/fixtures_regress/fixtures/special-article.json new file mode 100644 index 0000000000..435ceb7ca4 --- /dev/null +++ b/tests/fixtures_regress/fixtures/special-article.json @@ -0,0 +1,10 @@ +[ + { + "pk": 1, + "model": "fixtures_regress.specialarticle", + "fields": { + "title": "Article Title 1", + "channels": [] + } + } +] diff --git a/tests/fixtures_regress/models.py b/tests/fixtures_regress/models.py index 1cc30d2e51..7ba069ad08 100644 --- a/tests/fixtures_regress/models.py +++ b/tests/fixtures_regress/models.py @@ -70,6 +70,11 @@ class Article(models.Model): ordering = ('id',) +# Subclass of a model with a ManyToManyField for test_ticket_20820 +class SpecialArticle(Article): + 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 a6bad5716d..1d0fb9e724 100644 --- a/tests/fixtures_regress/tests.py +++ b/tests/fixtures_regress/tests.py @@ -431,6 +431,17 @@ class TestFixtures(TestCase): self.assertTrue("No fixture 'this_fixture_doesnt_exist' in" in 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): |
