如何在Django / Python中将模型对象列表序列化为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)

我为json.dumps()写了一个自定义的序列化器(编码器):

class AnalysisInputEncoder(json.JSONEncoder):

def default(self, obj):

if isinstance(obj, AnalysisInput):

return { "input_id" : obj.id,

"input_user" : obj.input_user,

"input_title" : obj.input_title,

"input_date" : obj.input_date.isoformat(),

"input_link" : obj.input_link }

return json.JSONEncoder.default(self, obj)

当我仅序列化一个对象时,我就能做到。当我尝试序列化对象列表时,我得到

[ objects..] is not JSON serializable

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

回答:

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

您可以as_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 / Python中将模型对象列表序列化为JSON 的全部内容, 来源链接: utcz.com/qa/397751.html

回到顶部