Django-rest-framework: рдмрдбрд╝реА рдлрд╝реНрд▓реЛрдЯ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ DecimalField рд╕рддреНрдпрд╛рдкрди рдкрд╛рд╕ рдХрд░рддреА рд╣реИрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдЕрдЧре░ 2015  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

рдмрдбрд╝реЗ рдлрд╝реНрд▓реЛрдЯ DecimalField рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

>>> serializers.DecimalField(max_digits=3, decimal_places=1).run_validation(200000000000.0)
>>> Decimal('2E+11')

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ ValidationError рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 3 рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрдХ рд╣реИрдВред Django рдХрд╛ рдлреЙрд░реНрдо рд╕рддреНрдпрд╛рдкрди рдЕрдкреЗрдХреНрд╖рд┐рдд рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ:

>>> forms.DecimalField(max_digits=3, decimal_places=1).clean(200000000000.0)
ValidationError: [u'Ensure that there are no more than 3 digits in total.']

рдпрджрд┐ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдирдореВрдирд╛ рдЗрдирдкреБрдЯ рд╕реЗ рд╢реВрдиреНрдп рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ ValidationError рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ:

>>> serializers.DecimalField(max_digits=3, decimal_places=1).run_validation(20000000000.0)
ValidationError: [u'Ensure that there are no more than 3 digits in total.']

рдЗрд╕реА рддрд░рд╣, рдЕрдкрд╡рд╛рдж рднреА рдореВрд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди Decimal рдФрд░ int рдХреЗ рд░реВрдк рдореЗрдВ:

>>> serializers.DecimalField(max_digits=3, decimal_places=1).run_validation(200000000000)
ValidationError: [u'Ensure that there are no more than 3 digits in total.']
>>> serializers.DecimalField(max_digits=3, decimal_places=1).run_validation(Decimal('200000000000.0'))
ValidationError: [u'Ensure that there are no more than 3 digits in total.']

рдПрдХ рдкреНрд░рдореБрдЦ рдкрдВрдХреНрддрд┐ рд╣рд╛рд▓ рд╣реА рдореЗрдВ https://github.com/tomchristie/django-rest-framework/pull/2948 рдореЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИ рдФрд░ Django рдХреЗ forms.DecimalField рд╕рддреНрдпрд╛рдкрди рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдХреЙрдкреА рдХреА рдЧрдИ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рд╢рдмреНрджрд╢рдГ:

decimals = exponent * decimal.Decimal(-1) if exponent < 0 else 0

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ #2948 рдореЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдореВрд▓ рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд░реЗрдЦрд╛ рдХреНрдпреЛрдВ рдмрджрд▓реАред рдЕрдЧрд░ рдореИрдВ рдореВрд▓ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдиреАрдЪреЗ рдПрдХ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдЪ рд╣реИ:

diff --git a/tests/test_fields.py b/tests/test_fields.py
index 0427873..cf41a5b 100644
--- a/tests/test_fields.py
+++ b/tests/test_fields.py
@@ -773,6 +773,7 @@ class TestDecimalField(FieldValues):
         (Decimal('Nan'), ["A valid number is required."]),
         (Decimal('Inf'), ["A valid number is required."]),
         ('12.345', ["Ensure that there are no more than 3 digits in total."]),
+        (200000000000.0, ["Ensure that there are no more than 3 digits in total."]),
         ('0.01', ["Ensure that there are no more than 1 decimal places."]),
         (123, ["Ensure that there are no more than 2 digits before the decimal point."])
     )

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрдм рдХреБрдЫ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдзрдиреНрдпрд╡рд╛рдж рд░рдпрд╛рдиред

рдЕрдм рдХреБрдЫ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред

@tomchristie @ryankask - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ 2015 рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝ рдореАрд▓ рдХреЗ рдкрддреНрдерд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЕрднреА рднреА рд╕рдВрд╕реНрдХрд░рдг 3.11.0 рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдлрд┐рдХреНрд╕ рдЕрдВрдд рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛ рд░рд╣рд╛ рдерд╛? рдиреАрдЪреЗ рдХреЛрдб:

class RecommendationSerializer(serializers.Serializer):
    total_owed = serializers.DecimalField(decimal_places=2, max_digits=8, min_value='1.00',
                                          rounding=ROUND_DOWN)
    term_length = serializers.IntegerField(min_value=1)

    class Meta:
        fields = ['total_owed', 'term_length']


serializer = RecommendationSerializer(data={'total_owed': '12.333333333333333', 'term_length': 6})
serializer.is_valid(raise_exception=True)

>>> {"total_owed": ["Ensure that there are no more than 8 digits in total."]}

@Audace рдЖрдкрдХреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕ рдЪрд░реНрдЪрд╛ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рд╕рдореВрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jpocentek picture jpocentek  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

orf picture orf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

akhilputhiry picture akhilputhiry  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hemanthsp picture hemanthsp  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sebdiem picture sebdiem  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ