2014-07-16 29 views
2

裏面我有一個jsonify templatetag:Django的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整個查詢集這工作得很好。但是我無法在查詢集中僅對一個項目進行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模型對象?

+0

我不認爲'__str__'是一個問題,因爲它的返回值是一個字符串,這當然是JSON序列化。 – janos

回答

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到序列化對象,但我不知道如何...