From e637f4723225d630e6066a04558a3549c83f8a5a Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Thu, 19 Jun 2008 21:15:33 +0000 Subject: [PATCH] Fixed #7475: fixed a possible race condition in ModelChoiceIterator. Thanks, esaj. git-svn-id: http://code.djangoproject.com/svn/django/trunk@7710 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/newforms/models.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/django/newforms/models.py b/django/newforms/models.py index 78a204125f6..eb6d01e787e 100644 --- a/django/newforms/models.py +++ b/django/newforms/models.py @@ -285,11 +285,17 @@ class ModelChoiceIterator(object): def __iter__(self): if self.field.empty_label is not None: yield (u"", self.field.empty_label) - for obj in self.queryset: - yield (obj.pk, self.field.label_from_instance(obj)) - # Clear the QuerySet cache if required. - if not self.field.cache_choices: - self.queryset._result_cache = None + if self.field.cache_choices: + if self.field.choice_cache is None: + self.field.choice_cache = [ + (obj.pk, self.field.label_from_instance(obj)) + for obj in self.queryset.all() + ] + for choice in self.field.choice_cache: + yield choice + else: + for obj in self.queryset.all(): + yield (obj.pk, self.field.label_from_instance(obj)) class ModelChoiceField(ChoiceField): """A ChoiceField whose choices are a model QuerySet.""" @@ -311,6 +317,7 @@ class ModelChoiceField(ChoiceField): Field.__init__(self, required, widget, label, initial, help_text, *args, **kwargs) self.queryset = queryset + self.choice_cache = None def _get_queryset(self): return self._queryset