JSON

2015-06-09 33 views
5

ile ilgili nesnelere sahip model nesneyi serileştirir Kişi ayrıntılarını kaydetmek için bir Person modeline sahibim. JSON

class Person(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100)  
    birthdate = models.DateField() 

Ayrıca ben kişinin faaliyeti günlükleri depolamak için bir model PersonLogs yaşıyorum.

class PersonLogs(models.Model): 
    person = models.ForeignKey(Person) 
    time = models.DateTimeField(auto_now_add=True) 

Kişi nesnelerini yanıt olarak JSON biçimine döndürmek için Django Serializer kullanıyorum.

from django.core import serializers 
data = serializers.serialize("json", Person.objects.all()) 

Çıktı:

{ 
    "model": "store.person", 
    "fields": { 
     "first_name": "Douglas", 
     "last_name": "Adams", 
     "birth_date": "1952-03-11", 
    } 
} 

Şimdi ben yanıt JSON içine PersonLogs dönmek istiyorum.

Beklenen Çıktı:

{ 
    "model": "store.person", 
    "fields": { 
     "first_name": "Douglas", 
     "last_name": "Adams", 
     "birth_date": "1952-03-11", 
     "personlogs": [['2015-06-09 15:42:58.861540'], ['2014-06-09 15:42:58.861540'], [2013-06-09 15:42:58.861540]] 
    } 
} 

ben resmi belgelere baktım ama herhangi bir yardım alamadım. link

+4

Sen Django istirahat Framework kullanmalıdır; Diziselleştiricileri çok daha esnektir ve ilişkileri takip edecek şekilde yapılandırılabilir. –

+0

Öneriniz için teşekkürler. Bunu Rest serializer'ın yardımıyla yaptım. –

cevap

3

Person ters ForeignKey ilişkisi ile serileştirmek istediğiniz gibi görünüyor. Django'nun serializer'ı bunu desteklemiyor. Örneğin, @DanielRoseman tarafından yapılan yorumlarda belirtildiği gibi Django REST Framework'ü kullanmanız gerekecektir.

Ancak, eğer taviz verebilirseniz, aşağıdaki çözüm işe yarayacaktır.

{ 
    "pk": 1, 
    "model": "models.PersonLogs", 
    "fields": { 
     "time": "2015-06-09 15:42:58.861540", 
     "person": ["Douglas", "Adams", "1952-03-11"] 
    } 
} 
1

Sen serialize şablonunu kullanabilirsiniz:

class PersonManager(models.Manager): 
    def get_by_natural_key(self, first_name, last_name, birthdate): 
     return self.get(first_name=first_name, last_name=last_name, birthdate=birthdate) 

class Person(models.Model): 
    objects = PersonManager() 

    # other fields 
    ... 

Şimdi, yerine Person seri hale, olur ki çıktı bu, PersonLogs serialize gerekecek.

Ver ilgili adı

class PersonLogs(models.Model): 
    person = models.ForeignKey(Person,related_name='logs') 
    time = models.DateTimeField(auto_now_add=True) 

PersonLogs için serialize şablonları oluşturun

logs_template = { 
    'fields': [':local'], 
} 
person_template = { 
    'fields' :[':local',':related'], 
    'related':{ 
     'logs':logs_template, 
    } 
} 

fonksiyonu aşağıda ile seri hale:

from preserialize.serialize import serialize 
finaldata = serialize(data, **person_template)