diff options
Diffstat (limited to 'tests/get_or_create')
| -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 865798ae98..4a33a809bb 100644 --- a/tests/get_or_create/models.py +++ b/tests/get_or_create/models.py @@ -32,6 +32,18 @@ class Thing(models.Model): name = models.CharField(max_length=255) 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 2ac5a862b0..60e1ef23f2 100644 --- a/tests/get_or_create/tests.py +++ b/tests/get_or_create/tests.py @@ -73,6 +73,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. @@ -328,6 +333,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. @@ -514,3 +524,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'}) |
