标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。