ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何更改django rest框架中序列化程序中使用的DECIMAL_SEPARATOR和THOUSAND_SEPARATOR?

2019-07-08 15:56:07  阅读:152  来源: 互联网

标签:python serialization django localization django-rest-framework


如何更改用于序列化DecimalField的DECIMAL_SEPARATOR和THOUSAND_SEPARATOR?或者我如何让django-rest-framework根据l10n自动使用正确的?

我的情况:

我正在使用django rest框架ModelSerializer来序列化类似下面的模型:

class House(models.Model):
    name = models.CharField(max_length=200)
    area = models.DecimalField(max_digits=7, decimal_places=2)

serializer.py代码如下:

class HouseSerializer(serializers.ModelSerializer):
    class Meta:
        model = House

在settings.py中,我已正确设置在模板中正常工作的本地化设置:

LANGUAGE_CODE = 'en-us'
USE_I18N = True
USE_L10N = True
LANGUAGES = (
    ('es', _('Spanish')),
    ('en', _('English')),
)

USE_THOUSAND_SEPARATOR = True

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

我使用ModelViewSet:

class HouseViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.HouseSerializer
    queryset = House.objects.all()

最后,我有urls.py与url中的i18n部分:

router = DefaultRouter()
router.register(r'house', viewsets.HouseViewSet)

urlpatterns += i18n_patterns('',
    url(r'^api/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)

当我在example.com/en/api/house/中请求数据(GET)时,我得到正确格式化的十进制字段:

{
    "name": "House in L.A.", 
    "area": "1,234.50", 
} 

但是,当我在example.com/es/api/house/中请求数据(GET)时,我得到的格式相同的十进制字段,这在西班牙语中是错误的.我需要得到:

{
    "name": "Casa en L.A.", 
    "area": "1.234,50", 
} 

我该怎么做?谢谢!

解决方法:

看起来DRF不支持号码本地化.在Django中,这有两种解决方式(more about this):

>在表单的字段中提供其他参数
>在模板中使用特殊标签或过滤器

它们都没有在DRF中使用.

但是django在django.utils.format中有帮助的功能 – number_format.您可以使用它来解决您的问题.

例如:

from django.utils.formats import number_format


class HouseSerializer(serializers.ModelSerializer):
    area = serializers.SerializerMethodField('area_localize')

    class Meta:
        model = House

    def area_localize(self, obj):
        return number_format(obj.area)

标签:python,serialization,django,localization,django-rest-framework
来源: https://codeday.me/bug/20190708/1403502.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有