18

現在、「title」フィールドと「summary」フィールドを持つPostモデルがあります。すべての投稿を取得し、RESTfulAPIインターフェースの一部としてJSONとして返します。

これが基本的なアプローチです

from django.core import serializers

def list_posts(request):
    posts = Post.objects.filter(owner=authenticated_user)
    serialized = serializers.serialize("json", posts, fields=('title', 'summary'))
    return HttpResponse(serialized, mimetype='application/json')

そして、対応するルートにアクセスすると、次の応答が返されます。

現在の応答

[{"pk": 4, "model": "api.post", "fields": {"summary": "Testing", "title": "My Test"}}, {"pk": 5, "model": "api.post", "fields": {"summary": "testing again", "title": "Another test"}}]

これには、クライアント側がモデルを構築するために必要なすべての情報が技術的に含まれています(Backboneを使用しており、collection.parseを使用して必要なものを構築できますが、サーバー側が応答を適切に構造化する責任を負う必要があります)。これについて私を悩ませているのは、評判の良いAPIで見慣れている標準のAPI応答のように見えないことです。次のようなJSON応答はより「標準的」だと思います。

望ましい応答

[{'summary': 'Testing', 'id': 4, 'title': 'My test'}, {'summary': 'My Test', 'id':5, 'title': 'Another test'}]

serializeからの出力は、API呼び出しからの応答としてJSONでモデルインスタンスのコレクションを返すのに適切ではないようです。これはかなり一般的なニーズのようです。id(または、pkと呼ばれる必要がある場合はpk)とともにフィールド情報を返したいのですが。

4

1 に答える 1

25

達成したいのは、json にダンプされたフィールドのサブセットです。

あなたがやっていることは、django の ORM オブジェクト全体をシリアライズすることです。良くない。

複雑にしないでおく:

import json

posts = (Post.objects.filter(owner=authenticated_user)
                     .values('id', 'title', 'summary'))
json_posts = json.dumps(list(posts))
于 2013-01-21T07:26:55.043 に答える