Python 有效序列化JSON对象

Python 有效序列化JSON对象,python,mysql,django,json,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.CharFiel

这是一个谜,我有这些伪模型:

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

}

我还没有测试过这个,但它应该会给你一个想法。从最里面的对象开始,使用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)

我还没有测试过这个,但它应该会给你一个想法。从最里面的对象开始,使用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)

这个建议可能不是您想要的,但我已经在一些情况下使用过它,在这些情况下,我需要应用程序数据的快速而肮脏的JSON

签出(或
app\u name.model\u name
)。这将为该应用程序(或该模型)的所有表中的所有数据提供JSON。格式可能与您所想的稍有不同,但它确实包含了维护ForeignKey关系所需的所有PK和class信息,并按照创建引用对象之前创建引用对象所需的顺序将它们吐出。非常方便


如果您想从脚本内部调用它,请查看
django/core/management/commands/dumpdata.py
以了解它们是如何实现的。

这个建议可能不是您想要的,但我曾在一些情况下使用过它,在这些情况下,我需要快速而肮脏的应用程序数据JSON

签出(或
app\u name.model\u name
)。这将为该应用程序(或该模型)的所有表中的所有数据提供JSON。格式可能与您所想的稍有不同,但它确实包含了维护ForeignKey关系所需的所有PK和class信息,并按照创建引用对象之前创建引用对象所需的顺序将它们吐出。非常方便


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

如果sub.name不在数据中[country.name][region.name][sub sub.name]应该是If sub.name不在数据中[country.name][region.name][sub sub sub sub name]如果子名称不在数据[国家/地区名称][地区名称]中,则应为