Django : <django.utils.functional.__proxy__对象在0x7feaac2761d0>不可JSON序列化
我在使用Django进行数据序列化时遇到了问题。
这是我用来表示州的模型:
class State(models.Model):
class Translation(translation.Translation):
name = models.CharField(max_length=64)
capital = models.ForeignKey('City', related_name="state_capital", null=True)
country = models.ForeignKey(Country, related_name="state_country", null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, default=Decimal("0.0"))
longitude = models.DecimalField(max_digits=9, decimal_places=6, default=Decimal("0.0"))
code = models.CharField(max_length=2)
我根据县的ID来筛选州的名称,并尝试将其转换成JSON格式,这样我就可以更新下拉框。
但是在这个过程中我遇到了问题。
<django.utils.functional.__proxy__ object at 0x7feaac2761d0> is not JSON serializable
这是我的视图代码。
def get_getstate(request):
catid = request.GET['catid']
get_related_subcategory = State.objects.filter(country_id = catid)
json_models = serializers.serialize("json", get_related_subcategory)
return HttpResponse(json_models, mimetype="application/javascript")
请帮我解决这个错误。
更新
我还尝试过这样做:
from django.core.serializers.json import Serializer as JSONSerializer
import decimal
import json
class DecimalEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, decimal.Decimal):
return '%.2f' % obj # Display Decimal obj as float
return json.JSONEncoder.default(self, obj)
class DecimalSerializer(JSONSerializer):
def end_serialization(self):
self.options.pop('stream', None)
self.options.pop('fields', None)
json.dump(self.objects, self.stream, cls=DecimalEncoder, **self.options)
这是我的视图代码:
def get_getstate(request):
catid = request.GET['catid']
get_related_subcategory = State.objects.filter(country_id = catid)
my_serializer = DecimalSerializer()
print my_serializer.serialize(get_related_subcategory, indent=4)
2 个回答
1
如果你在使用较旧版本的 django
,那么你不能直接把 QuerySets
转换成其他格式。你可以试试下面的代码:
json_models = serializers.serialize("json", list(get_related_subcategory))
另外,检查一下 get_related_subcategory
这个函数是不是返回了空值也很重要。你现在用的 django
是哪个版本呢?
19
django.utils.functional.__proxy__
对象是一种懒惰翻译。Django 的文档提到,当你用这个懒惰翻译作为参数调用 unicode() 时,它会生成一个当前语言环境下的 Unicode 字符串(https://docs.djangoproject.com/en/dev/ref/unicode/#translated-strings)。等翻译完成后,序列化就更有意义了。