2009-09-22 20 views
10

AJAX ile deneme yapmak için kullanıyorum basit bir görünüm var. Django modelleri ajax serializable değil

def get_shifts_for_day(request,year,month,day): 

    data= dict() 
    data['d'] =year 
    data['e'] = month 
    data['x'] = User.objects.all()[2] 

    return HttpResponse(simplejson.dumps(data), mimetype='application/javascript') 

Bu

döndürür aşağıdaki:

TypeError at /sched/shifts/2009/11/9/ 

<User: someguy> is not JSON serializable 

Verileri alırsan [ 'x'] satır herhangi çalıştığını modelleri ve döner bu referans değilim ki:

{"e": "11", "d": "2009"} 

Neden simplejson varsayılan django modellerinden birini ayrıştırmıyor? Kullandığım herhangi bir modelle aynı davranışı elde ediyorum. bunu kimin türleri bilmez verileri geçerken

+0

belirsiz bir soru, aslında yerleşik seri hale getirici başvuru için – geejay

cevap

29

sadece simplejson ne yapacağını bildirmek için, sizin .dumps çağrısında, bir default=encode_myway argüman eklemem gerekiyor - cevabını sizin "niçin" sorusu elbette olduğunu , zayıf simplejson modelinin örneklerinden biri ile ne yapacağını söylemedi.

Ve tabii ki örneğin JSON-encodable verileri sağlamakla encode_myway yazmak gerekir:

def encode_myway(obj): 
    if isinstance(obj, User): 
    return [obj.username, 
      obj.firstname, 
      obj.lastname, 
      obj.email] 
    # and/or whatever else 
    elif isinstance(obj, OtherModel): 
    return [] # whatever 
    elif ... 
    else: 
    raise TypeError(repr(obj) + " is not JSON serializable") 

Temelde, JSON hakkında ÇOK basit veri tipleri bilir (dizeleri, ints ve yüzen, dicts ve listeler halinde gruplandırılmış) - bu tür temel veri türlerinden her şeyle eşleşmesi için bir uygulama programcısı ve dump veya dumps zamanında default='a iletilen bir işlev aracılığıyla yapılan simplejson numaralı KILAVUZUNUZDAN sorumludur.

Alternatif olarak, Django'nun bir parçası olan json seri hale getiricisini kullanabilirsiniz, bkz. the docs.

+0

+1 sorununun başlığında bir soru değil. –

+2

django, hangi özelliklerin gerçekten önemli olduğunu (kullanıcının modelde tanımladığı özelliklerine göre) son kullanıcı için yeterince akıllı olamaz ve bu acıyı varsayılan olarak ## olarak kesebilir mi? –