Refs #28312 -- Added an optimized __bool__() to ModelChoiceIterator.
COUNT is more expensive than EXISTS; use the latter when possible.
This commit is contained in:
parent
3fca95e1ad
commit
d1413c5d70
|
@ -1145,6 +1145,9 @@ class ModelChoiceIterator:
|
|||
# and __len__() won't be called.
|
||||
return self.queryset.count() + (1 if self.field.empty_label is not None else 0)
|
||||
|
||||
def __bool__(self):
|
||||
return self.field.empty_label is not None or self.queryset.exists()
|
||||
|
||||
def choice(self, obj):
|
||||
return (self.field.prepare_value(obj), self.field.label_from_instance(obj))
|
||||
|
||||
|
|
|
@ -115,6 +115,17 @@ class ModelChoiceFieldTests(TestCase):
|
|||
(c4.pk, 'Fourth'),
|
||||
])
|
||||
|
||||
def test_choices_bool(self):
|
||||
f = forms.ModelChoiceField(Category.objects.all(), empty_label=None)
|
||||
self.assertIs(bool(f.choices), True)
|
||||
Category.objects.all().delete()
|
||||
self.assertIs(bool(f.choices), False)
|
||||
|
||||
def test_choices_bool_empty_label(self):
|
||||
f = forms.ModelChoiceField(Category.objects.all(), empty_label='--------')
|
||||
Category.objects.all().delete()
|
||||
self.assertIs(bool(f.choices), True)
|
||||
|
||||
def test_deepcopies_widget(self):
|
||||
class ModelChoiceForm(forms.Form):
|
||||
category = forms.ModelChoiceField(Category.objects.all())
|
||||
|
|
Loading…
Reference in New Issue