Django jsonify模板中的单个模型对象

时间:2014-07-16 19:17:16

标签: python json django django-models

我有一个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)

当我想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

看起来它正在尝试jsonify它从模型对象上调用__str__返回的结果,该对象定义如下:

def __str__(self):
        return "%s, %s - %s; %s" % (self.person.last_name, self.person.first_name, self.serial_number, self.date_time)

为了让我的jsonify方法在单个django模型对象而不是一组django模型对象上正常工作,我需要做些什么?

1 个答案:

答案 0 :(得分:3)

这将有效,但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正确地序列化对象,但我不知道如何......