有很多关于如何序列化模型QuerySet的文档,但是如何将模型实例的字段序列化为JSON呢?


当前回答

这个问题有一个很好的答案,我很惊讶它没有被提及。只需几行代码,您就可以处理日期、模型和其他所有内容。

制作一个可以处理模型的自定义编码器:

from django.forms import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Model

class ExtendedEncoder(DjangoJSONEncoder):

    def default(self, o):

        if isinstance(o, Model):
            return model_to_dict(o)

        return super().default(o)

现在在使用json.dumps时使用它

json.dumps(data, cls=ExtendedEncoder)

现在模型,日期和所有东西都可以序列化它不需要在数组中或序列化或非序列化。任何自定义的东西都可以添加到默认方法中。

你甚至可以这样使用Django的原生JsonResponse:

from django.http import JsonResponse

JsonResponse(data, encoder=ExtendedEncoder)

其他回答

如果你处理的是一个模型实例列表,你能做的最好的就是使用serializer .serialize(),它会非常适合你的需要。

但是,您将面临试图序列化单个对象而不是对象列表的问题。这样,为了摆脱不同的黑客,只需使用Django的model_to_dict(如果我没有弄错的话,serializer .serialize()也依赖于它):

from django.forms.models import model_to_dict

# assuming obj is your model instance
dict_obj = model_to_dict( obj )

现在只需要一个直接的json。Dumps调用,将其序列化为json:

import json
serialized = json.dumps(dict_obj)

就是这样!:)

使用python格式的Django Serializer,

from django.core import serializers

qs = SomeModel.objects.all()
serialized_obj = serializers.serialize('python', qs)

json和python格式有什么区别?

json格式将以str格式返回结果,而python将以list或OrderedDict格式返回结果

似乎你不能序列化实例,你必须序列化一个对象的QuerySet。

from django.core import serializers
from models import *

def getUser(request):
    return HttpResponse(json(Users.objects.filter(id=88)))

我运行了django的svn释放,所以这可能不是在早期版本。

下面是我的解决方案,它允许您轻松地自定义JSON以及组织相关记录

首先在模型上实现一个方法。我调用的是json,但你可以叫它任何你喜欢的,例如:

class Car(Model):
    ...
    def json(self):
        return {
            'manufacturer': self.manufacturer.name,
            'model': self.model,
            'colors': [color.json for color in self.colors.all()],
        }

然后在视图中:

data = [car.json for car in Car.objects.all()]
return HttpResponse(json.dumps(data), content_type='application/json; charset=UTF-8', status=status)

让这是一个农作物序列化器,做如下所示。对我有用,当然对你也有用。

首先导入序列化器

from django.core import serializers

然后你可以这样写

class CropVarietySerializer(serializers.Serializer): 
    crop_variety_info = serializers.serialize('json', [ obj, ])

或者你可以这样写

class CropVarietySerializer(serializers.Serializer): 
    crop_variety_info = serializers.JSONField() 

然后在views.py中调用这个序列化器 详情请访问https://docs.djangoproject.com/en/4.1/topics/serialization/ 序列化器。JSONField(*args, **kwargs)和serializer .JSONField()是相同的。您也可以访问https://www.django-rest-framework.org/api-guide/fields/了解JSONField()的详细信息。