2012-02-22 10 views
5

Bu yüzden, JSON'u & tüketmek için Django kullanarak arka taraf web hizmetini yazarken çalışıyorum ve meslektaşım ExtJS4 ön tarafında çalışıyor. Yuvalanmış nesneleri serileştirebilmek için wadofstuff serializer kullanıyorum.Nesneleri "alanlar" alanı olmadan serileştirmek için Django'yu alma

Meslektaşım, json ayrıştırma konusunda sorun yaşıyor, özellikle de Django, "alanlar" alanındaki bir nesnenin alanlarını koyar. Kısa bir örnek:

şeyler şimdi tefrika ediliyor yolu:

{ 
    "pk":1, 
    "model":"events.phone", 
    "fields":{ 
    "person":1, 
    "name":"Cell", 
    "number":"444-555-6666" 
    } 
} 

Onları ExtJS ve mutlu arkadaşlarımın geliştirici yapmak seri hale getirmek istiyoruz yolu:

{ 
    "pk":1, 
    "model":"events.phone", 
    "person":1, 
    "name":"Cell", 
    "number":"444-555-6666" 
} 

Biz gerekecektir Bununla birlikte, bundan daha karmaşık olan bazı nesneleri serileştirmek için.

Django veya wadofstuff serializörünü bir alan alanı kullanmamak için seri hale getirmelerimi elle yazmanın herhangi bir yolu var mı?

+0

Orada bu değiştirmenin yolu vardır, ama nedenini bilmek ilgi duyarım meslektaşınız bunu serpmek gibi problemler yaşıyor - sadece bir seviye aşağı. –

+0

Sorun, içinde serileştirilmiş dört farklı modele sahip olan daha karmaşık bir nesneye sahip olduğumuzda, bunlardan ikisi de içinde başka bir serileştirilmiş modele sahip. – jawilmont

cevap

16

Serileştirme işleminizi özelleştirmenin en iyi yolu, önce Django'yu Python dicts serisine serileştirmektir. Sonra işlem-sonrası olabilir o dicts sizin gibi ancak, JSON onları dışarı damping önce:

# this gives you a list of dicts 
raw_data = serializers.serialize('python', Phone.objects.all()) 
# now extract the inner `fields` dicts 
actual_data = [d['fields'] for d in raw_data] 
# and now dump to JSON 
output = json.dumps(actual_data) 
25

Ayrıca, django genel modeli JSON çıktısını modifiye bir daha esnek bir yol var. Yukarıdaki örnekte

from django.core.serializers.json import Serializer as Builtin_Serializer 

class Serializer(Builtin_Serializer): 
    def get_dump_object(self, obj): 
     return self._current 

ben hem pk ve model tuşları kurtulmak ve ben dönmek: get_dump_object yöntem ve geçersiz - (Ben piton acemi olduğum oldukça basittir) django.core.serializers modül kaynak koduna bir göz atın alanları hemen.

orijinal kodudur:

def get_dump_object(self, obj): 
    return { 
     "pk": smart_text(obj._get_pk_val(), strings_only=True), 
     "model": smart_text(obj._meta), 
     "fields": self._current 
    } 

asıl soruya çözüm olabilir, örneğin:

def get_dump_object(self, obj): 
    metadata = { 
     "pk": smart_text(obj._get_pk_val(), strings_only=True), 
     "model": smart_text(obj._meta), 
    } 
    return dict(metadata.items() + self._current.items()) 
+4

Siz efendim, bir beyefendi ve bir bilgin var. –

İlgili konular