Skip to main content
 首页 » 编程设计

python之Django jsonify 模板内的单个模型对象

2024年08月27日29jpfss

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