【问题标题】:Django jsonify a single model object inside of a templateDjango jsonify 模板内的单个模型对象
【发布时间】:2014-09-07 11:03:23
【问题描述】:

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

{% for t in ticket_set %}
    <tr class="clickableRow tip-top" onclick="rowClick('{{ t | jsonify }}');" >

{% endfor %}

当模板标签尝试将单个项目 t 而非整个集合 ticket_set json 化时,我收到错误:

<ProblemTicket: SMITH, JOHN - XXXXXXXXX; 2014-07-16 19:09:21.140000+00:00> is not JSON serializable

看起来它正在尝试将它从调用 __str__ 得到的结果 json 化,该模型对象的定义如下:

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

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

【问题讨论】:

  • 我不认为__str__有问题,因为它的返回值是一个字符串,肯定是JSON可序列化的。

标签: python json django django-models


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 2011-09-28
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多