diff options
| author | François Freitag <mail@franek.fr> | 2018-04-13 18:39:10 -0700 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-04-23 13:03:07 -0400 |
| commit | d1413c5d703c60dfb9e2a418c79b3e4aed32ffac (patch) | |
| tree | 59f5a13de1561e5b4930cae91aee9f163a40d076 | |
| parent | 3fca95e1ad5b355f7813b98c97a194a30f2ab47b (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.py | 3 | ||||
| -rw-r--r-- | tests/model_forms/test_modelchoicefield.py | 11 |
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()) |
