Skip to content

Commit 62fc98b

Browse files
authored
Merge pull request #1467 from tfranzel/decimal_l18n
Add l18n handling for Decimal field #1466
2 parents 5221afd + d7247a5 commit 62fc98b

3 files changed

Lines changed: 10 additions & 1 deletion

File tree

drf_spectacular/openapi.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from django.core import exceptions as django_exceptions
1010
from django.core import validators
1111
from django.db import models
12+
from django.utils.formats import get_format
1213
from django.utils.translation import gettext_lazy as _
1314
from rest_framework import permissions, renderers, serializers
1415
from rest_framework.fields import _UnvalidatedField, empty
@@ -821,7 +822,8 @@ def _map_serializer_field(self, field, direction, bypass_extensions=False):
821822
content['pattern'] = (
822823
r'^-?0?' if field.max_whole_digits == 0 else fr'^-?\d{{0,{field.max_whole_digits}}}'
823824
)
824-
content['pattern'] += fr'(?:\.\d{{0,{field.decimal_places}}})?$'
825+
sep = get_format("DECIMAL_SEPARATOR") if field.localize else "."
826+
content['pattern'] += fr'(?:\{sep}\d{{0,{field.decimal_places}}})?$'
825827
else:
826828
content = build_basic_type(OpenApiTypes.DECIMAL)
827829
if field.max_whole_digits is not None:

tests/test_i18n.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
class I18nModel(models.Model):
2525
field_str = models.TextField()
2626
field_choice = models.CharField(max_length=10, choices=TRANSPORT_CHOICES)
27+
field_decimal = models.DecimalField(max_digits=4, decimal_places=2)
2728

2829
class Meta:
2930
verbose_name = _("Internationalization")
@@ -34,6 +35,7 @@ class XSerializer(serializers.ModelSerializer):
3435
class Meta:
3536
model = I18nModel
3637
fields = '__all__'
38+
extra_kwargs = {'field_decimal': {'localize': True}}
3739

3840

3941
class XViewset(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):

tests/test_i18n.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,13 @@ components:
141141
type: string
142142
field_choice:
143143
$ref: '#/components/schemas/FieldChoiceEnum'
144+
field_decimal:
145+
type: string
146+
format: decimal
147+
pattern: ^-?\d{0,2}(?:\,\d{0,2})?$
144148
required:
145149
- field_choice
150+
- field_decimal
146151
- field_str
147152
- id
148153
securitySchemes:

0 commit comments

Comments
 (0)