2012-04-11 2 views
0

Ceci est un peu un casse-tête, j'ai ces modèles pseudo:objet Sérialisation JSON efficacement

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) 

Je suis en train de JSON SERIALIZE leurs données ci-dessous. Cependant, je ne suis pas sûr de savoir comment le faire efficacement (en évitant les requêtes de base de données trop), des suggestions sont appréciés

{ 

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

} 

Répondre

3

Je ne l'ai pas testé, mais il devrait vous donner l'idée. Commencez avec l'objet le plus profond, utilisez select_related pour parcourir la hiérarchie, puis faites une boucle sur les objets les plus secrets, en ajoutant les clés de la hiérarchie selon vos besoins. Juste un avertissement, s'il y a des pays/régions/sous-régions sans aucune succession, ils ne seront pas inclus dans le JSON. Si ce n'est pas le cas, vous devrez interroger chacun des modèles séparément.

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

génial, merci –

+1

si sub.name pas dans les données [country.name] [region.name] [sub.name] devrait être si sub.name pas dans les données [country.name] [region.name] –

1

Cette suggestion pourrait ne pas être exactement ce que vous recherchez, mais je l'ai utilisé dans quelques situations où je avais besoin JSON rapide et sale des données d'une application.

Extrayez ./manage.py dumpdata app_name (ou app_name.model_name). Cela vous donne JSON pour toutes les données dans toutes les tables de cette application (ou ce modèle). Le format peut être un peu différent de ce à quoi vous pensiez, mais il inclut toutes les informations de PK et de classe nécessaires pour maintenir les relations ForeignKey, et il les recrée dans l'ordre nécessaire pour créer l'objet référencé avant que objet de référencement. Très utile.

Si vous souhaitez l'appeler à l'intérieur d'un script, regardez django/core/management/commands/dumpdata.py pour voir comment ils le font.