我有一个 jsonify 模板标签:
from django.core.serializers import serialize
from django.db.models.query import QuerySet
from django.core.serializers.json import DjangoJSONEncoder
from django.utils import simplejson
from django.template import Library
from django.utils.safestring import mark_safe
register = Library()
def jsonify(object):
if isinstance(object, QuerySet):
return mark_safe(serialize('json', object))
return mark_safe(simplejson.dumps(object, cls=DjangoJSONEncoder))
register.filter('jsonify', jsonify)
当我想要对整个 QuerySet 进行 jsonify 时,这很好用。但是我无法仅对查询集中的单个项目进行 jsonify。
{% for t in ticket_set %}
<tr class="clickableRow tip-top" onclick="rowClick('{{ t | jsonify }}');" >
{% endfor %}
当模板标签试图 jsonify 单个项目 t 而不是整个集合 ticket_set 我得到一个错误:
<ProblemTicket: SMITH, JOHN - XXXXXXXXX; 2014-07-16 19:09:21.140000+00:00> is not JSON serializable
它看起来像是在尝试对从模型对象上调用 __str__ 返回的结果进行 jsonify,该模型对象定义如下:
def __str__(self):
return "%s, %s - %s; %s" % (self.person.last_name, self.person.first_name, self.serial_number, self.date_time)
为了让我的 jsonify 方法在单个 django 模型对象而不是一组模型对象上正确工作,我需要做什么?
请您参考如下方法:
这会起作用,但 json 将是一个数组:
def jsonify(object):
if isinstance(object, QuerySet):
return mark_safe(serialize('json', object))
return mark_safe(serialize('json', [object]))
这将删除数组包装器,但它很难看:
def jsonify(object):
if isinstance(object, QuerySet):
return mark_safe(serialize('json', object))
return mark_safe(json.dumps(json.loads(serialize('json', [object])))[0])
最好以某种方式让 DjangoJSONEncoder 正确序列化对象,但我不知道如何...
