使用Model在Django中创建JSON响应

abi*_*son 6 python django json django-models django-serializer

我在这里有一些问题.我试图返回由消息和模型实例组成的JSON响应:

   class MachineModel(models.Model):
       name = models.CharField(max_length=64, blank=False)
       description = models.CharField(max_length=64, blank=False)
       manufacturer = models.ForeignKey(Manufacturer)
       added_by = models.ForeignKey(User, related_name='%(app_label)s_%(class)s_added_by')
       creation_date = models.DateTimeField(auto_now_add=True)
       last_modified = models.DateTimeField(auto_now=True)

    machine_model_model = form.save(commit=False)
    r_user = request.user.userprofile
    machine_model_model.manufacturer_id = manuf_id
    machine_model_model.added_by_id = request.user.id
    machine_model_model.save()
    alert_message = " The'%s' model " % machine_model_model.name
    alert_message += ("for '%s' " % machine_model_model.manufacturer)
    alert_message += "was was successfully created!"
    test = simplejson.dumps(list(machine_model_model))
    data = [{'message': alert_message, 'model': test}]
    response = JSONResponse(data, {}, 'application/json')


class JSONResponse(HttpResponse):
"""JSON response class."""
    def __init__(self, obj='', json_opts={}, mimetype="application/json", *args, **kwargs):
        content = simplejson.dumps(obj, **json_opts)
        super(JSONResponse,self).__init__(content, mimetype, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但我一直在:

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")

TypeError: <MachineModel: "Test12"> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

这是为什么?我以前见过:

models = Model.objects.filter(manufacturer_id=m_id)
json = simplejson.dumps(models)
Run Code Online (Sandbox Code Playgroud)

这有效......有什么区别?!

谢谢!

Ser*_*ney 14

您应该使用django序列化器而不是simplejson:

例如,这会返回正确的序列化数据:

from django.core import serializers
# serialize queryset
serialized_queryset = serializers.serialize('json', some_queryset)
# serialize object
serialized_object = serializers.serialize('json', [some_object,])
Run Code Online (Sandbox Code Playgroud)


JPG*_*JPG 5

方法1:使用Django的python序列化器

我认为这个答案不会返回JSON或Python dict / list对象。因此,请使用格式python代替json

from django.core import serializers
# serialize queryset
serialized_queryset = serializers.serialize('python', some_queryset)
# serialize object
serialized_object = serializers.serialize('python', [some_object,])
Run Code Online (Sandbox Code Playgroud)

Django Shell响应

In [2]: from django.core import serializers                                                                                                                             

In [3]: qs = SomeModel.objects.all()                                                                                                                                    

In [4]: json_res = serializers.serialize('json',qs)                                                                                                                     

In [5]: type(json_res)                                                                                                                                                  
Out[5]: str

In [6]: python_res = serializers.serialize('python',qs)                                                                                                                 

In [7]: type(python_res)                                                                                                                                                
Out[7]: list
Run Code Online (Sandbox Code Playgroud)
#views.py
from django.core import serializers
from django.http.response import JsonResponse


def some_view(request):
    some_queryset = SomeModel.objects.all()
    serialized_queryset = serializers.serialize('python', some_queryset)
    return JsonResponse(serialized_queryset, safe=False)
Run Code Online (Sandbox Code Playgroud)

方法2:使用Django的values()方法

直接使用values()method会引发TypeError异常,因此请按如下所示将转换QuerySet为python list

from django.http.response import JsonResponse


def sample_view(request):
    return JsonResponse(list(SomeModel.objects.all().values()), safe=False)
Run Code Online (Sandbox Code Playgroud)