Django : <django.utils.functional.__proxy__对象在0x7feaac2761d0>不可JSON序列化

10 投票
2 回答
8883 浏览
提问于 2025-04-17 15:58

我在使用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)。等翻译完成后,序列化就更有意义了。

撰写回答