2015-06-09 11 views
5

Sto avendo un modello Person per memorizzare i dettagli della persona.serializza oggetto modello con oggetti correlati su JSON

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

anche Sto avendo modello PersonLogs per memorizzare i registri delle attività della persona.

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

Sto utilizzando Django Serializer per restituire gli oggetti Persona in formato JSON come risposta.

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

uscita:

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

Ora voglio tornare PersonLogs in risposta JSON.

risultato atteso:

{ 
    "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]] 
    } 
} 

ho guardato in documentazione ufficiale, ma non ho avuto alcun aiuto. link

+4

si dovrebbe usare Django Resto quadro; i suoi serializzatori sono molto più flessibili e possono essere configurati per seguire le relazioni. –

+0

Grazie per il tuo suggerimento. L'ho fatto con l'aiuto del serializzatore Rest. –

risposta

3

Sembra che si desideri serializzare Person con rapporto inverso ForeignKey. Il serializzatore di Django non supporta questo. Dovrai utilizzare Django REST Framework, ad esempio, come indicato nei commenti allo @DanielRoseman.

Ma se è possibile scendere a compromessi, la seguente soluzione funzionerà.

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 
    ... 

Ora, invece di serializzazione Person, dovrete per serializzare PersonLogs, che sarà in uscita questo:

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

È possibile utilizzare template serializzare.

danno nome relative al PersonLogs

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

Creare modelli di serializzare

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

serializzare con funzione di seguito:

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