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 に答える