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
This commit is contained in:
Jacob Kaplan-Moss 2008-06-19 21:15:33 +00:00
parent 5d09d8769d
commit e637f47232
1 changed files with 12 additions and 5 deletions

View File

@ -285,11 +285,17 @@ class ModelChoiceIterator(object):
def __iter__(self): def __iter__(self):
if self.field.empty_label is not None: if self.field.empty_label is not None:
yield (u"", self.field.empty_label) yield (u"", self.field.empty_label)
for obj in self.queryset: 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)) 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
class ModelChoiceField(ChoiceField): class ModelChoiceField(ChoiceField):
"""A ChoiceField whose choices are a model QuerySet.""" """A ChoiceField whose choices are a model QuerySet."""
@ -311,6 +317,7 @@ class ModelChoiceField(ChoiceField):
Field.__init__(self, required, widget, label, initial, help_text, Field.__init__(self, required, widget, label, initial, help_text,
*args, **kwargs) *args, **kwargs)
self.queryset = queryset self.queryset = queryset
self.choice_cache = None
def _get_queryset(self): def _get_queryset(self):
return self._queryset return self._queryset