0

这有点令人困惑,我有这些伪模型:

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

}
4

2 回答 2

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)
于 2012-04-11T14:12:33.597 回答
1

这个建议可能不是您正在寻找的,但我已经在几个需要应用程序数据的快速且脏的 JSON 的情况下使用它。

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

如果您想从脚本内部调用它,django/core/management/commands/dumpdata.py请查看他们是如何做到的。

于 2012-04-11T15:59:22.500 回答