这有点难题,我有这些伪模型:
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... }
}
答案 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
以查看它们是如何进行的。