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]如果子名称不在数据[国家/地区名称][地区名称]中,则应为