Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将django/python中的模型对象列表序列化为JSON_Python_Json_Django_Django Models - Fatal编程技术网

如何将django/python中的模型对象列表序列化为JSON

如何将django/python中的模型对象列表序列化为JSON,python,json,django,django-models,Python,Json,Django,Django Models,我正在尝试序列化定义为以下内容的模型对象列表: class AnalysisInput(models.Model): input_user = models.CharField(max_length=45) input_title = models.CharField(max_length=45) input_date = models.DateTimeField() input_link = models.CharField(max_length=100) 我

我正在尝试序列化定义为以下内容的模型对象列表:

class AnalysisInput(models.Model):
    input_user = models.CharField(max_length=45)
    input_title = models.CharField(max_length=45)
    input_date = models.DateTimeField()
    input_link = models.CharField(max_length=100)
我为json.dumps()编写了一个自定义序列化程序(编码器):

当我只序列化一个对象时,我就能够做到这一点。当我尝试序列化我得到的对象列表时

[ objects..] is not JSON serializable

我搜索了一下,但没有找到工作的地方。。我正在考虑为模型对象列表编写一个自定义序列化程序。

自定义编码器不是递归调用的。实际上,最好不要使用自定义编码器,而是在序列化之前将对象转换为简单的python类型

您可以将
作为_json
或类似命名的方法添加到您的模型中,并在每次需要json结果时调用该方法:

class AnalysisInput(models.Model):
    input_user = models.CharField(max_length=45)
    input_title = models.CharField(max_length=45)
    input_date = models.DateTimeField()
    input_link = models.CharField(max_length=100)

    def as_json(self):
        return dict(
            input_id=self.id, input_user=self.input_user,
            input_title=self.input_title, 
            input_date=self.input_date.isoformat(),
            input_link=self.input_link)
那么在你看来,

# one result
return HttpResponse(json.dumps(result.as_json()), content_type="application/json")

# a list of results
results = [ob.as_json() for ob in resultset]
return HttpResponse(json.dumps(results), content_type="application/json")

我发现序列化Django模型的最佳方法是使用
Django.core.serializers
将模型列表序列化为JSON、XML或YAML。不需要自定义序列化代码!文件如下:

以下是我的实现:

lead/models.py:

from django.db import models

class Lead(models.Model):
    name = models.CharField(max_length=50)
    email = models.CharField(max_length=256)
    phone = models.CharField(max_length=20)
    twitter_handle = models.CharField(max_length=20)
    github_handle = models.CharField(max_length=20)
lead/views.py:

from django.http import HttpResponse
from django.core import serializers
from lead.models import Lead

def index(request):
    leads_as_json = serializers.serialize('json', Lead.objects.all())
    return HttpResponse(leads_as_json, content_type='json')
最终结果是:

[{"pk": 1, "model": "lead.lead", "fields": {"twitter_handle": "johndoe", "name": "John Doe", "phone": "1(234)567-8910", "email": "john@doe.com", "github_handle": "johndoe"}}]
最简单的解决方案:

def index(request):
    data = serializers.serialize('json', Product.objects.all())
    return HttpResponse(data, content_type='application/json')

它工作正常,完美无瑕:)。。我可以问你为什么我不应该使用自定义编码器吗?@Francesco:你必须写一些完全递归所有列表、元组和映射的东西才能找到你的模型对象。但是,在视图中,您已经确切地知道模型对象的位置,从而更易于维护代码。当然,你可以将这两种技术结合起来;例如,当我尝试它时,我得到了这个异常>
unbound方法,因为必须以Category instance作为第一个参数调用_json()
@AlexJolig:您在模型的实际实例上调用它,而不是模型本身。看起来很棒!方法名/签名应该是
作为dict(self)
,因为它实际上并没有返回json…如何定制响应?
def index(request):
    data = serializers.serialize('json', Product.objects.all())
    return HttpResponse(data, content_type='application/json')