Django で QuerySet を JSON に変換する

Vaibhav Vaibhav 2023年1月30日
  1. カスタムメソッドを使用して、QuerySetJSON に変換する
  2. Django の組み込みシリアライザーを使用して QuerySetJSON に変換する
  3. values() 関数を使用して、QuerySetJSON に変換する
Django で QuerySet を JSON に変換する

Django では、モデルにクエリが適用されると、すべてのモデルマネージャーが QuerySet を返します。QuerySet は、Python と Django のテンプレート言語で簡単に使用できます。QuerySet に対して多くのアクションを実行して、目的の結果またはレコードをフェッチできます。ただし、QuerySet には欠点があります。JSON ではシリアル化できません。

Web アプリケーションとは別に、Django は API の作成にも使用されます。API では、データがサーバーとクライアントの間を JSON 形式で移動するため、JSON が不可欠です。

QuerySetJSON に直接変換することはできませんが、QuerySet を使用して Python オブジェクトまたは文字列化された JSON を作成できます。それを達成する方法はいくつかあります。この記事では、QuerySetJSON に変換するためのいくつかの最良の方法について説明します。

カスタムメソッドを使用して、QuerySetJSON に変換する

次のような Django モデルがあるとします。このモデルのオブジェクトを受け入れ、オブジェクトのディクショナリ表現を返す関数を作成できます。

from django.db import models


class Person(models.Model):
    username = models.CharField(max_length=200, unique=True)
    firstName = models.CharField(max_length=200)
    middleName = models.CharField(max_length=200)
    lastName = models.CharField(max_length=200)
    age = models.IntegerField(default=0)

また、変換の処理方法は以下のとおりです。

def personToDictionary(person):
    if person == None:
        return None

    dictionary = {}
    dictionary["username"] = person.username
    dictionary["firstName"] = person.firstName
    dictionary["middleName"] = person.middleName
    dictionary["lastName"] = person.lastName
    dictionary["age"] = person.age

    return dictionary


person = Person.objects.get(id=25)
personDictionary = personToDictionary(person)

このアプローチにより、ディクショナリ表現に含めるデータをより細かく制御できます。たとえば、外部キーがある場合、参照モデルのさまざまな情報を含めることができます。また、いくつかの計算を実行して、それらを辞書に含めることもできます。

Django の組み込みシリアライザーを使用して QuerySetJSON に変換する

Django には、モデルを目的の形式に変換するために使用できるシリアライザーが組み込まれています。シリアライザーを使用して、モデルを JSONXMLJSONL、および YAML 形式に変換できます。一部の形式では、動作するためにいくつかの追加の Python ライブラリが必要です。

上記の Person モデルを JSON 形式に変換する必要があるとします。そのためには、次のようにします。

from django.core import serializers

person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())

シリアライザーは、単一のモデルと QuerySet を変換できます。person 変数と people 変数には、JSON 形式のデータが含まれるようになります。

モデルの名前フィールドのみを変換する必要があるとしましょう。これを実現するには、次のようにします。

from django.core import serializers

person = serializers.serialize(
    "json", Person.objects.get(id=25), fields=("firstName", "middleName", "lastName")
)
people = serializers.serialize(
    "json", Person.objects.all(), fields=("firstName", "middleName", "lastName")
)

fields パラメーターをモデルのフィールド名のタプルに設定する必要があります。ここで注意すべき重要な点の 1つは、主キーである id は、言及するかどうかに関係なく、常にシリアル化されるということです。

シリアライザーの詳細については、Django の公式ドキュメントこちらを参照してください。

values() 関数を使用して、QuerySetJSON に変換する

3 番目のアプローチでは、QuerySet を介して呼び出すことができる values() メソッドを使用します。QuerySet はモデルインスタンスのセットを返し、values() メソッドはモデルインスタンスを表す辞書のセットを返します。

次のコードを参照してください。

person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()

デフォルトでは、ディクショナリにはテーブルのすべてのフィールドが含まれています。フィールドを制限する必要がある場合は、このメソッドでオプションの位置引数*fields を使用できます。次のコードスニペットを参照してください。

person = Person.objects.filter(age=25).values("id", "age", "firstName", "lastName")
people = Person.objects.all().values("id", "firstName")
著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.