88

クエリセットをシリアライズしたいのですが、このビューが出力する形式でそれが必要です:

class JSONListView(ListView):
    queryset = Users.objects.all()

    def get(self, request, *args, **kwargs):
        return HttpResponse(json.dumps({'data': [['bar','foo','bar','foo'],['foo','bar','foo','bar']]}, indent=4), content_type='application/json')

例の手動データの代わりにクエリセットを出力する方法がわかりません。

私はもう試した

json.dumps({"data": self.get_queryset()})

serializers.serialize("json", {'data': self.get_queryset()})

しかし、うまくいきません。私は何を間違っていますか?カスタム JSON エンコーダーを作成する必要がありますか?

4

8 に答える 8

143

JsonResponsevaluesとともに使用できます。簡単な例:

from django.http import JsonResponse

def some_view(request):
    data = list(SomeModel.objects.values())  # wrap in list(), because QuerySet is not JSON serializable
    return JsonResponse(data, safe=False)  # or JsonResponse({'data': data})

または、 Django の組み込みシリアライザーを使用した別のアプローチ:

from django.core import serializers
from django.http import HttpResponse

def some_view(request):
    qs = SomeModel.objects.all()
    qs_json = serializers.serialize('json', qs)
    return HttpResponse(qs_json, content_type='application/json')

この場合、結果はわずかに異なります (デフォルトではインデントなし):

[
    {
        "model": "some_app.some_model",
        "pk": 1,
        "fields": {
            "name": "Elon",
            "age": 48,
            ...
        }
    },
    ...
]

マシュマロのようなものを使用してクエリセットをシリアル化することをお勧めします。

...パフォーマンスを向上させるためのいくつかの注意事項:

  • クエリセットが大きい場合はページネーションを使用してください。
  • objects.values()必要なフィールドのリストを指定して、シリアル化を回避し、不要なモデルのフィールドをクライアントに送信するために使用します ( に渡すこともできますfields) serializers.serialize
于 2016-06-15T15:07:34.157 に答える
43

QuerySets は JSON でシリアル化できないため、機能しませんでした。

1) json.dumpsQuerySet を JSON シリアライズ可能オブジェクトに明示的に変換する必要がある場合:

class Model(model.Model):
    def as_dict(self):
        return {
            "id": self.id,
            # other stuff
        }

そして連載:

dictionaries = [ obj.as_dict() for obj in self.get_queryset() ]
return HttpResponse(json.dumps({"data": dictionaries}), content_type='application/json')

2) シリアライザーの場合。シリアライザーは、JSON シリアライズ可能オブジェクトまたは QuerySet のいずれかを受け入れますが、QuerySet を含むディクショナリーはどちらも受け入れません。これを試して:

serializers.serialize("json", self.get_queryset())

詳細については、こちらをご覧ください。

https://docs.djangoproject.com/en/dev/topics/serialization/

于 2013-04-08T08:27:15.307 に答える