Django で QuerySet を JSON に変換する
-
カスタムメソッドを使用して、
QuerySet
をJSON
に変換する -
Django の組み込みシリアライザーを使用して
QuerySet
をJSON
に変換する -
values()
関数を使用して、QuerySet
をJSON
に変換する
Django では、モデルにクエリが適用されると、すべてのモデルマネージャーが QuerySet
を返します。QuerySet
は、Python と Django のテンプレート言語で簡単に使用できます。QuerySet
に対して多くのアクションを実行して、目的の結果またはレコードをフェッチできます。ただし、QuerySet
には欠点があります。JSON
ではシリアル化できません。
Web アプリケーションとは別に、Django は API の作成にも使用されます。API では、データがサーバーとクライアントの間を JSON
形式で移動するため、JSON
が不可欠です。
QuerySet
を JSON
に直接変換することはできませんが、QuerySet
を使用して Python オブジェクトまたは文字列化された JSON
を作成できます。それを達成する方法はいくつかあります。この記事では、QuerySet
を JSON
に変換するためのいくつかの最良の方法について説明します。
カスタムメソッドを使用して、QuerySet
を JSON
に変換する
次のような 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 の組み込みシリアライザーを使用して QuerySet
を JSON
に変換する
Django には、モデルを目的の形式に変換するために使用できるシリアライザーが組み込まれています。シリアライザーを使用して、モデルを JSON
、XML
、JSONL
、および 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()
関数を使用して、QuerySet
を JSON
に変換する
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")