2012-04-11 21 views
0

Dies ist ein bisschen wie ein Puzzle, ich diese Pseudo-Modelle haben:Serialisieren JSON-Objekt effektiv

class Country(models.Model): 
    name = models.CharField(unique=True) 

class Region(models.Model): 
    name = models.CharField(unique=True) 
    country = models.ForeignKey(Country) 

class SubRegion(models.Model): 
    name = models.CharField(unique=True) 
    region = models.ForeignKey(Region) 

class Estate(models.Model): 
    name = models.CharField(unique=True) 
    sub_region = models.ForeignKey(SubRegion) 

Ich versuche zu JSON serialisiert ihre Daten wie unten. Allerdings bin mir nicht sicher, wie dies effektiv zu tun (zu viele Datenbankabfragen zu vermeiden) werden Vorschläge

geschätzt
{ 

    CountryX: { 
     RegionX { 
      SubRegionX = [ 
       "EstateX" 
       "EstateY", 
       "EstateZ" 
      ], 
      SubRegionY = [ etc... ] 
     }, 
     RegionY { etc... } 
    }, 
    CountryY: { etc... } 

} 

Antwort

3

ich dies nicht getestet, aber es sollte Ihnen die Idee geben. Beginne mit dem innersten Objekt, benutze select_related, um die Hierarchie zu durchlaufen, dann schlinge über die innersten Objekte und füge nach Bedarf die Schlüssel für die Hierarchie hinzu.

Nur eine Warnung, wenn es Länder/Regionen/Subregionen ohne Nachlässe gibt, werden diese nicht in das JSON aufgenommen. Wenn das nicht in Ordnung ist, müssen Sie jedes der Modelle separat abfragen. vielleicht nicht genau

data = {} 
for e in Estate.objects.select_related("sub_region__region__country"): 
    sub, region, country = e.sub_region, e.sub_region.region, e.sub_region.region.country 
    if country.name not in data: 
     data[country.name] = {} 
    if region.name not in data[country.name]: 
     data[country.name][region.name] = {} 
    if sub.name not in data[country.name][region.name]: 
     data[country.name][region.name][sub.name] = [] 
    data[country.name][region.name][sub.name].append(e.name) 
json_data = json.dumps(data) 
+0

genial, danke –

+1

wenn sub.name nicht in Daten [Land.Name] [Region.Name] [Sub.Name] sollte sein, wenn Sub.Name nicht in Daten [Land.Name] [Region.Name] –

1

Dieser Vorschlag, was Sie gesucht haben, aber ich habe es in ein paar Situationen, in denen ich schnell und unsaubere JSON von einer App-Daten benötigt.

Auschecken ./manage.py dumpdata app_name (oder app_name.model_name). Dadurch erhalten Sie JSON für alle Daten in allen Tabellen dieser App (oder dieses Modells). Das Format kann ein wenig anders sein, als Sie dachten, aber es enthält alle PK- und Klasseninformationen, die erforderlich sind, um ForeignKey-Beziehungen aufrechtzuerhalten, und spuckt sie in der Reihenfolge aus, die zum Erstellen des referenzierten Objekts vor erforderlich ist Objekt referenzieren. Sehr praktisch.

Wenn Sie es von innerhalb eines Skripts aufrufen möchten, sehen Sie sich django/core/management/commands/dumpdata.py an, um zu sehen, wie es geht.