45

Flash と Android アプリの両方で使用できるように、Django でいくつかの RESTful サービスの開発に取り組んでいます。

サービス インターフェイスの開発は非常に簡単でしたが、外部キーと多対多の関係を持つオブジェクトをシリアル化する際に問題が発生しました。

私はこのようなモデルを持っています:

class Artifact( models.Model ):
    name                = models.CharField( max_length = 255 )
    year_of_origin      = models.IntegerField( max_length = 4, blank = True, null = True )
    object_type         = models.ForeignKey( ObjectType, blank = True, null = True )
    individual          = models.ForeignKey( Individual, blank = True, null = True )
    notes               = models.TextField( blank = True, null = True )

次に、 を使用して、このモデルに対して次のようなクエリを実行しselect_related()、外部キーの関係が確実に守られるようにします。

artifact = Artifact.objects.select_related().get(pk=pk)

オブジェクトを取得したら、それをシリアル化し、ビューに戻します。

serializers.serialize( "json", [ artifact ] )

これは私が得たものです。外部キー (object_type と individual) は、関連するオブジェクトの ID にすぎないことに注意してください。

[
      {
            pk: 1
            model: "artifacts.artifact"
            fields: {
                year_of_origin: 2010
                name: "Dummy Title"
                notes: ""
                object_type: 1
                individual: 1
            }
      }
]

これは素晴らしいことですが、使用時に私が望んでselect_related()いたのは、オブジェクトの ID だけでなく、関連するオブジェクトを外部キー フィールドに自動的に入力することでした。

私は最近 Django に改宗しましたが、CakePHP での開発にかなりの時間を費やしました。

Cake ORM について私が本当に気に入っているのは、それがリレーションシップに従い、デフォルトでネストされたオブジェクトを作成し、クエリを呼び出すときにリレーションシップをバインド解除できることです。

これにより、ケースバイケースで介入を必要としない方法で、サービスを非常に簡単に抽象化することができました。

Django はデフォルトでこれを行わないことがわかりましたが、オブジェクトとそれに関連するすべてのオブジェクトを自動的にシリアル化する方法はありますか? ヒントや読書は大歓迎です。

4

5 に答える 5

23

RESTful の目的ではありませんが、同様の要件がありました。私の場合、「完全な」シリアル化モジュールを使用して、必要なことを達成できましたDjango Full Serializers。これはwadofstuffの一部であり、新しい BSD ライセンスの下で配布されます。

Wadofstuff はこれをとても簡単にします。たとえば、あなたの場合、次のことを行う必要があります。

まず、wadofstuff をインストールします。

次に、次の設定をsettings.pyファイルに追加します。

SERIALIZATION_MODULES = {
    'json': 'wadofstuff.django.serializers.json'
}

3 番目に、シリアル化に使用するコードを少し変更します。

artifact = Artifact.objects.select_related().get(pk=pk)
serializers.serialize( "json", [ artifact ], indent = 4, 
    relations = ('object_type', 'individual',))

重要な変更点は、relationsキーワード パラメータです。唯一の (マイナーな) 落とし穴は、関連するモデルの名前ではなく、関係を形成するフィールドの名前を使用することです。

警告

ドキュメントから:

Wad of Stuff シリアライザーは、モデルをシリアライズする際に Django シリアライザーと 100% 互換性があります。データ ストリームを逆シリアル化する場合、Deserializerクラスは現在、標準の Django シリアライザーによって返されるシリアル化されたデータでのみ機能します。

(強調を追加)

お役に立てれば。

于 2010-09-20T17:14:19.780 に答える
1

このチケットの詳細については、次を参照してください。

関係に従う深さを指定して、詳細なシリアル化を許可する https://code.djangoproject.com/ticket/4656

于 2011-06-27T14:36:33.090 に答える