diff options
| author | Jacob Kaplan-Moss <jacob@jacobian.org> | 2008-06-19 21:15:33 +0000 |
|---|---|---|
| committer | Jacob Kaplan-Moss <jacob@jacobian.org> | 2008-06-19 21:15:33 +0000 |
| commit | e637f4723225d630e6066a04558a3549c83f8a5a (patch) | |
| tree | f98061bb29e2b860ad53cb8e33f7a6bdabe0d274 | |
| parent | 5d09d8769d7eb7fd8dffdf5c0705e25173c59006 (diff) | |
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
| -rw-r--r-- | django/newforms/models.py | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/django/newforms/models.py b/django/newforms/models.py index 78a204125f..eb6d01e787 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 |
