summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJacob Kaplan-Moss <jacob@jacobian.org>2009-04-18 15:51:11 +0000
committerJacob Kaplan-Moss <jacob@jacobian.org>2009-04-18 15:51:11 +0000
commit41260fb93165a9fa18dba31b4766c8be50b430cb (patch)
tree440f030eebcd9e12a8749185aa69e54eb448ac06 /django
parent800311964e0325545552febde0e092f93a12208f (diff)
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.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10582 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-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 de5f1abb45..95fc41e77f 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -794,14 +794,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