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


当前回答

如果你处理的是一个模型实例列表,你能做的最好的就是使用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)

就是这样!:)

其他回答

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

首先导入序列化器

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()的详细信息。

你可以很容易地使用一个列表来包装所需的对象,这就是django序列化器正确序列化它所需要的,例如:

from django.core import serializers

# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])

我通过在我的模型中添加一个序列化方法来解决这个问题:

def toJSON(self):
    import simplejson
    return simplejson.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

下面是对那些讨厌一行程序的人的冗长等效:

def toJSON(self):
    fields = []
    for field in self._meta.fields:
        fields.append(field.name)

    d = {}
    for attr in fields:
        d[attr] = getattr(self, attr)

    import simplejson
    return simplejson.dumps(d)

_meta。Fields是模型字段的有序列表,可以从实例和模型本身访问。

.values()是我需要将模型实例转换为JSON。

.values()文档:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values

名为Project的模型的示例使用。

注意:我使用的是Django Rest Framework

from django.http import JsonResponse

@csrf_exempt
@api_view(["GET"])
def get_project(request):
    id = request.query_params['id']
    data = Project.objects.filter(id=id).values()
    if len(data) == 0:
        return JsonResponse(status=404, data={'message': 'Project with id {} not found.'.format(id)})
    return JsonResponse(data[0])

有效id的结果:

{
    "id": 47,
    "title": "Project Name",
    "description": "",
    "created_at": "2020-01-21T18:13:49.693Z",
}

为了避免数组包装器,在返回响应之前删除它:

import json
from django.core import serializers

def getObject(request, id):
    obj = MyModel.objects.get(pk=id)
    data = serializers.serialize('json', [obj,])
    struct = json.loads(data)
    data = json.dumps(struct[0])
    return HttpResponse(data, mimetype='application/json')

关于这个话题,我也发现了一篇有趣的帖子:

http://timsaylor.com/convert-django-model-instances-to-dictionaries

它使用django.forms.models。Model_to_dict,它看起来是完成这项工作的完美工具。