有效地序列化JSON对象

时间:2012-04-11 14:05:49

标签: python mysql django json

这有点难题,我有这些伪模型:

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)

我正在尝试将JSON序列化,如下所示。但是我不确定如何有效地做到这一点(避免过多的数据库查询),建议表示赞赏

{

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

}

2 个答案:

答案 0 :(得分:3)

我没有测试过这个,但它应该给你这个想法。从最里面的对象开始,使用select_related遍历层次结构,然后遍历最里面的对象,根据需要添加层次结构的密钥。

只是注意警告,如果有没有任何庄园的国家/地区/子区域,它们将不会包含在JSON中。如果不行,您需要单独查询每个模型。

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)

答案 1 :(得分:1)

这个建议可能不完全是你想要的,但我在一些情况下使用它,我需要快速和脏的应用程序数据的JSON。

结帐./manage.py dumpdata app_name(或app_name.model_name)。这为您为该应用程序(或该模型)的所有表中的所有数据提供了JSON。格式可能与您考虑的有点不同,但它确实包含了维护ForeignKey关系所需的所有PK和类信息,并且它按照创建引用对象之前的顺序将它们吐出

如果要从脚本内部调用它,请查看django/core/management/commands/dumpdata.py以查看它们是如何进行的。