Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

[1.5.x] Merge pull request #495 from aisipos/ticket_18949

Fixed #18949 -- Improve performance of model_to_dict with many-to-many

Backport of 4d766b3.
  • Loading branch information...
commit d828d4e186b5433f637b86c4e44a3b68acab5cb8 1 parent f7552a2
Alex Gaynor alex authored Alex Gaynor committed
Showing with 37 additions and 1 deletion.
  1. +1 −1  django/forms/models.py
  2. +36 −0 tests/modeltests/model_forms/tests.py
2  django/forms/models.py
View
@@ -126,7 +126,7 @@ def model_to_dict(instance, fields=None, exclude=None):
data[f.name] = []
else:
# MultipleChoiceWidget needs a list of pks, not object instances.
- data[f.name] = [obj.pk for obj in f.value_from_object(instance)]
+ data[f.name] = list(f.value_from_object(instance).values_list('pk', flat=True))
else:
data[f.name] = f.value_from_object(instance)
return data
36 tests/modeltests/model_forms/tests.py
View
@@ -561,6 +561,42 @@ def test_unique_for_date_with_nullable_date(self):
"slug": "Django 1.0"}, instance=p)
self.assertTrue(form.is_valid())
+class ModelToDictTests(TestCase):
+ """
+ Tests for forms.models.model_to_dict
+ """
+ def test_model_to_dict_many_to_many(self):
+ categories=[
+ Category(name='TestName1', slug='TestName1', url='url1'),
+ Category(name='TestName2', slug='TestName2', url='url2'),
+ Category(name='TestName3', slug='TestName3', url='url3')
+ ]
+ for c in categories:
+ c.save()
+ writer = Writer(name='Test writer')
+ writer.save()
+
+ art = Article(
+ headline='Test article',
+ slug='test-article',
+ pub_date=datetime.date(1988, 1, 4),
+ writer=writer,
+ article='Hello.'
+ )
+ art.save()
+ for c in categories:
+ art.categories.add(c)
+ art.save()
+
+ with self.assertNumQueries(1):
+ d = model_to_dict(art)
+
+ #Ensure all many-to-many categories appear in model_to_dict
+ for c in categories:
+ self.assertIn(c.pk, d['categories'])
+ #Ensure many-to-many relation appears as a list
+ self.assertIsInstance(d['categories'], list)
+
class OldFormForXTests(TestCase):
def test_base_form(self):
self.assertEqual(Category.objects.count(), 0)
Please sign in to comment.
Something went wrong with that request. Please try again.