如何获取Django moneyed货币列表并在React前端展示,解决序列化报错
问题原因
你遇到的报错是因为django-moneyed返回的CURRENCIES常量、list_all_currencies()函数的返回值都是Currency类的实例对象,Django默认的JSON序列化器无法直接序列化自定义类实例。
报错示例:
TypeError(f'Object of type {o.__class__.__name__} ') TypeError: Object of type Currency is not JSON serializable
解决方案
方案1:普通Django视图场景
遍历Currency对象,仅提取前端需要的属性构造可序列化的字典列表即可,示例代码如下:
from moneyed import list_all_currencies from django.http import JsonResponse def get_currency_dropdown_options(request): currency_options = [] for cur in list_all_currencies(): # 可根据需求增删返回的字段,不需要symbol可以删除对应行 currency_options.append({ "value": cur.code, "label": f"{cur.code} - {cur.name}", "symbol": cur.symbol }) return JsonResponse({"currency_options": currency_options})
方案2:Django REST Framework 接口场景
如果是在DRF序列化器中处理Currency字段,可通过自定义字段映射逻辑实现序列化:
from rest_framework import serializers from .models import YourBusinessModel class YourBusinessSerializer(serializers.ModelSerializer): # 显式映射Currency实例的属性到序列化字段 currency_code = serializers.CharField(source="currency.code") currency_name = serializers.CharField(source="currency.name") class Meta: model = YourBusinessModel fields = ["id", "currency_code", "currency_name"]
注意事项
- 不要直接将Currency实例放入返回的序列化数据中,必须显式提取对应的属性
- 如果下拉菜单仅需要货币三位代码作为提交值,仅提取
code属性即可满足需求
内容的提问来源于stack exchange,提问作者Mapelo Msiwa
相关产品推荐
相关产品推荐

