diff options
| author | Jacob Kaplan-Moss <jacob@jacobian.org> | 2009-04-18 15:52:58 +0000 |
|---|---|---|
| committer | Jacob Kaplan-Moss <jacob@jacobian.org> | 2009-04-18 15:52:58 +0000 |
| commit | 2ee33cf63bba3ec26d9b4845136f48477182e7e4 (patch) | |
| tree | 2e6c551f6a956d1ac24d0c8f7cdb99f16f309674 /django/forms/models.py | |
| parent | c17547ac50959f7df9e2b8288bae55806c433782 (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/models.py')
| -rw-r--r-- | django/forms/models.py | 18 |
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 |
