gc5*_*gc5 17 python django json 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)
Run Code Online (Sandbox Code Playgroud)
我为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)
Run Code Online (Sandbox Code Playgroud)
当我只序列化一个对象时,我能够做到.当我尝试序列化我得到的对象列表时
[ objects..] is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
我搜索但我没有找到工作的地方..我正在考虑为模型对象列表编写自定义序列化器.
Mar*_*ers 40
自定义编码器不会递归调用.实际上,最好不使用自定义编码器,而是在序列化之前将对象转换为简单的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)
Run Code Online (Sandbox Code Playgroud)
然后在你看来:
# 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")
Run Code Online (Sandbox Code Playgroud)
小智 18
我发现序列化Django模型的最好方法是使用django.core.serializers将模型列表序列化为JSON,XML或YAML.无需自定义序列化代码!文档在这里:https://docs.djangoproject.com/en/dev/topics/serialization/
这是我的实现:
铅/ 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)
Run Code Online (Sandbox Code Playgroud)
铅/ 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')
Run Code Online (Sandbox Code Playgroud)
最终结果:
[{"pk": 1, "model": "lead.lead", "fields": {"twitter_handle": "johndoe", "name": "John Doe", "phone": "1(234)567-8910", "email": "john@doe.com", "github_handle": "johndoe"}}]
Run Code Online (Sandbox Code Playgroud)