summaryrefslogtreecommitdiff
path: root/django/forms
diff options
context:
space:
mode:
authorJacob Kaplan-Moss <jacob@jacobian.org>2009-04-18 15:52:58 +0000
committerJacob Kaplan-Moss <jacob@jacobian.org>2009-04-18 15:52:58 +0000
commit2ee33cf63bba3ec26d9b4845136f48477182e7e4 (patch)
tree2e6c551f6a956d1ac24d0c8f7cdb99f16f309674 /django/forms
parentc17547ac50959f7df9e2b8288bae55806c433782 (diff)
[1.0.X\ Fixed #10156: `ModelMultipleChoiceField.clean` now does a single query instead of O(N). Thanks, Alex Gaynor. Also, I ported a few more doctests to unittests. Backport of r10582 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10583 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/forms')
-rw-r--r--django/forms/models.py18
1 files changed, 9 insertions, 9 deletions
diff --git a/django/forms/models.py b/django/forms/models.py
index 871c58430c..02324aade4 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -757,14 +757,14 @@ class ModelMultipleChoiceField(ModelChoiceField):
return []
if not isinstance(value, (list, tuple)):
raise ValidationError(self.error_messages['list'])
- final_values = []
- for val in value:
+ for pk in value:
try:
- obj = self.queryset.get(pk=val)
- except self.queryset.model.DoesNotExist:
- raise ValidationError(self.error_messages['invalid_choice'] % val)
+ self.queryset.filter(pk=pk)
except ValueError:
- raise ValidationError(self.error_messages['invalid_pk_value'] % val)
- else:
- final_values.append(obj)
- return final_values
+ raise ValidationError(self.error_messages['invalid_pk_value'] % pk)
+ qs = self.queryset.filter(pk__in=value)
+ pks = set([force_unicode(o.pk) for o in qs])
+ for val in value:
+ if force_unicode(val) not in pks:
+ raise ValidationError(self.error_messages['invalid_choice'] % val)
+ return qs