2015-06-09 11 views
5

Ich habe ein Person Modell, um Personendaten zu speichern.Serialize Modellobjekt mit verwandten Objekten zu JSON

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

i Modell ist auch PersonLogs Protokolle Person Aktivität zu speichern.

Ich benutze Django Serializer, um Person-Objekte in JSON-Format als Antwort zurückzugeben.

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

Ausgang:

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

Jetzt möchte ich PersonLogs in Antwort JSON zurückzukehren.

Erwarteter Ausgang:

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

ich in offiziellen Dokumenten gesucht, aber ich nicht bekommen keine Hilfe. link

+4

Sie sollten Django Ruhe Framework verwenden; Seine Serialisierer sind viel flexibler und können so konfiguriert werden, dass sie Beziehungen folgen. –

+0

Danke für Ihren Vorschlag. Ich habe dies mit Hilfe von Rest Serializer getan. –

Antwort

3

Es scheint, dass Sie Person mit umgekehrten ForeignKey Beziehung serialisieren möchten. Djangos Serializer unterstützt das nicht. Sie müssen das Django-REST-Framework verwenden, z. B. wie in den Kommentaren von @DanielRoseman angegeben.

Aber wenn Sie einen Kompromiss eingehen können, wird die folgende Lösung funktionieren. Jetzt

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

statt Person von Serialisierung, werden Sie PersonLogs serialisiert haben, die folgende Ausgabe folgendermaßen aus:

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

Sie serialize Vorlage verwenden können.

Give verwandte Namen PersonLogs

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

serialize Vorlagen erstellen

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

serialisiert es mit folgenden Funktion:

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