#13666: Updates with F objects on decimal fields raise MySQL warnings
-------------------------------------+-------------------------------------
     Reporter:  KyleMac              |                    Owner:  nobody
         Type:  Bug                  |                   Status:  closed
    Component:  Database layer       |                  Version:  1.7
  (models, ORM)                      |               Resolution:
     Severity:  Normal               |  worksforme
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Simon Charette):

 * status:  new => closed
 * resolution:   => worksforme


Comment:

 I'm not able to reproduce anymore on MySQL 8 strict mode (minimum version
 planned for 4.2) so they must have sorted out their decimal arithmetic
 over the years so even if the `Cast` could be added by
 `CombinedExpression` or even by MySQL's `combine_expression` I don't think
 it's worth doing at this point.

 Closing as ''worksforme'' as demonstrated by this test.

 {{{#!diff
 diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py
 index 9a64d51766..2a9bcd95cc 100644
 --- a/tests/model_fields/models.py
 +++ b/tests/model_fields/models.py
 @@ -16,6 +16,10 @@
  except ImportError:
      Image = None

 +class Account(models.Model):
 +    name = models.CharField(max_length=100)
 +    balance = models.DecimalField(decimal_places=2, max_digits=12)
 +

  class Foo(models.Model):
      a = models.CharField(max_length=10)
 diff --git a/tests/model_fields/test_decimalfield.py
 b/tests/model_fields/test_decimalfield.py
 index 912d55af72..a45e634ff4 100644
 --- a/tests/model_fields/test_decimalfield.py
 +++ b/tests/model_fields/test_decimalfield.py
 @@ -3,10 +3,10 @@

  from django.core import validators
  from django.core.exceptions import ValidationError
 -from django.db import models
 +from django.db import models, connection
  from django.test import TestCase

 -from .models import BigD, Foo
 +from .models import Account, BigD, Foo


  class DecimalFieldTests(TestCase):
 @@ -113,3 +113,14 @@ def test_roundtrip_with_trailing_zeros(self):
          obj = Foo.objects.create(a="bar", d=Decimal("8.320"))
          obj.refresh_from_db()
          self.assertEqual(obj.d.compare_total(Decimal("8.320")),
 Decimal("0"))
 +
 +    def test_update_difference(self):
 +        acc = Account.objects.create(balance="10.00")
 +        acc.balance = models.F("balance") - "1.79"
 +        acc.save()
 +        acc.refresh_from_db()
 +        self.assertEqual(acc.balance, Decimal("8.21"))
 +        with connection.cursor() as cursor:
 +            cursor.execute("SHOW WARNINGS")
 +            self.assertIsNone(cursor.fetchone())
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/13666#comment:14>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701829f0dfbee-b3913ca7-2d1f-412a-beb3-ea583193ea3d-000000%40eu-central-1.amazonses.com.

Reply via email to