summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrançois Freitag <mail@franek.fr>2018-04-13 18:39:10 -0700
committerTim Graham <timograham@gmail.com>2018-04-23 13:03:07 -0400
commitd1413c5d703c60dfb9e2a418c79b3e4aed32ffac (patch)
tree59f5a13de1561e5b4930cae91aee9f163a40d076
parent3fca95e1ad5b355f7813b98c97a194a30f2ab47b (diff)
Refs #28312 -- Added an optimized __bool__() to ModelChoiceIterator.
COUNT is more expensive than EXISTS; use the latter when possible.
-rw-r--r--django/forms/models.py3
-rw-r--r--tests/model_forms/test_modelchoicefield.py11
2 files changed, 14 insertions, 0 deletions
diff --git a/django/forms/models.py b/django/forms/models.py
index 67006ba390..cf66f10c88 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -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))
diff --git a/tests/model_forms/test_modelchoicefield.py b/tests/model_forms/test_modelchoicefield.py
index 975873c7f9..adb3754382 100644
--- a/tests/model_forms/test_modelchoicefield.py
+++ b/tests/model_forms/test_modelchoicefield.py
@@ -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())