From b2f72fc0405e966a5c4dbce23e84a43d80db3614 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 24 Jul 2009 13:38:36 +0000 Subject: Fixed #11527 -- Added unit tests and documentation for the use of F() expressions in single object updates. Thanks to Zachary Voase for the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@11322 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/modeltests/expressions/models.py | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'tests') diff --git a/tests/modeltests/expressions/models.py b/tests/modeltests/expressions/models.py index f29767a9d1..d4de5ccee9 100644 --- a/tests/modeltests/expressions/models.py +++ b/tests/modeltests/expressions/models.py @@ -80,4 +80,43 @@ Traceback (most recent call last): ... FieldError: Joined field references are not permitted in this query +# F expressions can be used to update attributes on single objects +>>> test_gmbh = Company.objects.get(name='Test GmbH') +>>> test_gmbh.num_employees +32 +>>> test_gmbh.num_employees = F('num_employees') + 4 +>>> test_gmbh.save() +>>> test_gmbh = Company.objects.get(pk=test_gmbh.pk) +>>> test_gmbh.num_employees +36 + +# F expressions cannot be used to update attributes which are foreign keys, or +# attributes which involve joins. +>>> test_gmbh.point_of_contact = None +>>> test_gmbh.save() +>>> test_gmbh.point_of_contact is None +True +>>> test_gmbh.point_of_contact = F('ceo') +Traceback (most recent call last): +... +ValueError: Cannot assign "": "Company.point_of_contact" must be a "Employee" instance. + +>>> test_gmbh.point_of_contact = test_gmbh.ceo +>>> test_gmbh.save() +>>> test_gmbh.name = F('ceo__last_name') +>>> test_gmbh.save() +Traceback (most recent call last): +... +FieldError: Joined field references are not permitted in this query + +# F expressions cannot be used to update attributes on objects which do not yet +# exist in the database +>>> acme = Company(name='The Acme Widget Co.', num_employees=12, num_chairs=5, +... ceo=test_gmbh.ceo) +>>> acme.num_employees = F('num_employees') + 16 +>>> acme.save() +Traceback (most recent call last): +... +TypeError: int() argument must be a string or a number, not 'ExpressionNode' + """} -- cgit v1.3