diff options
| author | Tom Christie | 2013-03-13 11:42:12 +0000 |
|---|---|---|
| committer | Tom Christie | 2013-03-13 11:42:12 +0000 |
| commit | a798a5350a6aa3100695d41d4d37ec7e2e073bdd (patch) | |
| tree | 894455f0f98283db650bd08f01d21d4260b0a44d /rest_framework | |
| parent | 126cadf27e5956dffd44ed7330f101745fdb37d3 (diff) | |
| download | django-rest-framework-a798a5350a6aa3100695d41d4d37ec7e2e073bdd.tar.bz2 | |
Fix duplicated database queries for paginated lists.
Closes #713.
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/fields.py | 16 | ||||
| -rw-r--r-- | rest_framework/tests/pagination.py | 10 |
2 files changed, 16 insertions, 10 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 0a199f10..4b6931ad 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -26,14 +26,16 @@ def is_simple_callable(obj): """ True if the object is a callable that takes no arguments. """ - try: - args, _, _, defaults = inspect.getargspec(obj) - except TypeError: + function = inspect.isfunction(obj) + method = inspect.ismethod(obj) + + if not (function or method): return False - else: - len_args = len(args) if inspect.isfunction(obj) else len(args) - 1 - len_defaults = len(defaults) if defaults else 0 - return len_args <= len_defaults + + args, _, _, defaults = inspect.getargspec(obj) + len_args = len(args) if function else len(args) - 1 + len_defaults = len(defaults) if defaults else 0 + return len_args <= len_defaults def get_component(obj, attr_name): diff --git a/rest_framework/tests/pagination.py b/rest_framework/tests/pagination.py index 472ffcdd..3c76ca7d 100644 --- a/rest_framework/tests/pagination.py +++ b/rest_framework/tests/pagination.py @@ -73,7 +73,9 @@ class IntegrationTestPagination(TestCase): GET requests to paginated ListCreateAPIView should return paginated results. """ request = factory.get('/') - response = self.view(request).render() + # Note: Database queries are a `SELECT COUNT`, and `SELECT <fields>` + with self.assertNumQueries(2): + response = self.view(request).render() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['count'], 26) self.assertEqual(response.data['results'], self.data[:10]) @@ -81,7 +83,8 @@ class IntegrationTestPagination(TestCase): self.assertEqual(response.data['previous'], None) request = factory.get(response.data['next']) - response = self.view(request).render() + with self.assertNumQueries(2): + response = self.view(request).render() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['count'], 26) self.assertEqual(response.data['results'], self.data[10:20]) @@ -89,7 +92,8 @@ class IntegrationTestPagination(TestCase): self.assertNotEqual(response.data['previous'], None) request = factory.get(response.data['next']) - response = self.view(request).render() + with self.assertNumQueries(2): + response = self.view(request).render() self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data['count'], 26) self.assertEqual(response.data['results'], self.data[20:]) |
