diff options
| author | Alex <alex@gmail.com> | 2017-05-19 06:40:43 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-05-27 13:01:38 -0400 |
| commit | b9abdd92ab21a796943e8047e778eebc671c8c00 (patch) | |
| tree | d3032d5ba9f6a7eee44e64a7b19334e41efcf6e9 /tests | |
| parent | f804b46294c58d80452c91c485717fe8a31b2f47 (diff) | |
[1.11.x] Fixed #28222 -- Allowed settable properties in QuerySet.update_or_create()/get_or_create() defaults.
Backport of 37ab3c3f9d707d6a1896db79c631e920dcb1fb78 from master
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/get_or_create/models.py | 12 | ||||
| -rw-r--r-- | tests/get_or_create/tests.py | 18 |
2 files changed, 30 insertions, 0 deletions
diff --git a/tests/get_or_create/models.py b/tests/get_or_create/models.py index 0394434408..b5fe534e3a 100644 --- a/tests/get_or_create/models.py +++ b/tests/get_or_create/models.py @@ -36,6 +36,18 @@ class Thing(models.Model): name = models.CharField(max_length=256) tags = models.ManyToManyField(Tag) + @property + def capitalized_name_property(self): + return self.name + + @capitalized_name_property.setter + def capitalized_name_property(self, val): + self.name = val.capitalize() + + @property + def name_in_all_caps(self): + return self.name.upper() + class Publisher(models.Model): name = models.CharField(max_length=100) diff --git a/tests/get_or_create/tests.py b/tests/get_or_create/tests.py index d727bdee5d..0c8efb6f4e 100644 --- a/tests/get_or_create/tests.py +++ b/tests/get_or_create/tests.py @@ -77,6 +77,11 @@ class GetOrCreateTests(TestCase): """ Thing.objects.get_or_create(pk=1) + def test_get_or_create_with_model_property_defaults(self): + """Using a property with a setter implemented is allowed.""" + t, _ = Thing.objects.get_or_create(defaults={'capitalized_name_property': 'annie'}, pk=1) + self.assertEqual(t.name, 'Annie') + def test_get_or_create_on_related_manager(self): p = Publisher.objects.create(name="Acme Publishing") # Create a book through the publisher. @@ -336,6 +341,11 @@ class UpdateOrCreateTests(TestCase): """ Thing.objects.update_or_create(pk=1) + def test_update_or_create_with_model_property_defaults(self): + """Using a property with a setter implemented is allowed.""" + t, _ = Thing.objects.get_or_create(defaults={'capitalized_name_property': 'annie'}, pk=1) + self.assertEqual(t.name, 'Annie') + def test_error_contains_full_traceback(self): """ update_or_create should raise IntegrityErrors with the full traceback. @@ -522,3 +532,11 @@ class InvalidCreateArgumentsTests(SimpleTestCase): def test_multiple_invalid_fields(self): with self.assertRaisesMessage(FieldError, "Invalid field name(s) for model Thing: 'invalid', 'nonexistent'"): Thing.objects.update_or_create(name='a', nonexistent='b', defaults={'invalid': 'c'}) + + def test_property_attribute_without_setter_defaults(self): + with self.assertRaisesMessage(FieldError, "Invalid field name(s) for model Thing: 'name_in_all_caps'"): + Thing.objects.update_or_create(name='a', defaults={'name_in_all_caps': 'FRANK'}) + + def test_property_attribute_without_setter_kwargs(self): + with self.assertRaisesMessage(FieldError, "Invalid field name(s) for model Thing: 'name_in_all_caps'"): + Thing.objects.update_or_create(name_in_all_caps='FRANK', defaults={'name': 'Frank'}) |
