Django ORM Model's basic query operation API
1. Model インスタンスオブジェクトの作成
本文を読む前に、この記事のデータテーブル構造を参照してください。
save メソッドを使用して Model インスタンスを作成します。
Topic には User オブジェクトが必要なため、まず username が admin(スーパーユーザー)の User オブジェクトを取得してから、Topic オブジェクトを作成します。
user = User.objects.get(username='admin')
topic = Topic(title='Great China', content='Long live the motherland。', user=user)
topic. save()
2. 単一インスタンスを返すクエリメソッド
get を使用したクエリ:
topic = Topic.objects.get(id=1, title=u'Great China')
return HttpResponse("Hello World。" + topic. content)
get_or_create を使用したクエリ:
クエリ対象のインスタンスが存在しない場合、get_or_create メソッドは新しいインスタンスオブジェクトを作成します。
get との違いは、(object, created) のタプルオブジェクトを返す点です。最初の要素がインスタンスオブジェクト、2 番目の要素が返されたインスタンスオブジェクトが新規作成されたかどうかを示すブール値です。
3. QuerySet を返すクエリメソッド
複数のデータレコードを返す必要がある場合は、QuerySet オブジェクトを使用します。
QuerySet の非常に重要な特徴は遅延読み込みです。つまり、実際に使用されるときに初めてデータベースにアクセスしてレコードを取得します。
all メソッドを使用してすべてのデータレコードを取得します:
all_topic = Topic.objects.all()
return HttpResponse("Hello World。" + all_topic[0].content)
order_by メソッドを使用して照合順序をカスタマイズします:
order_by では複数のソートフィールドを指定できます。たとえば、すべての Topic オブジェクトをまずタイトルで逆順ソートし、次に created_time で昇順ソートします:
all_topic = Topic.objects.order_by('-title', 'created_time')
filter メソッドを使用してデータレコードを絞り込みます:
filter メソッドを使う前に、条件付きクエリのキーワードを確認しましょう:
contains、startswith、endswith のキーワードには、大文字小文字を無視する対応バージョンもあります。キーワードの前に i を付けるだけです。たとえば icontains のようになります。
id=1 の Topic をクエリします:
all_topic = Topic.objects.filter(id__exact=1)
チェーンクエリ:
filter や exclude などのメソッドが返す結果は QuerySet であるため、その後に filter や exclude などのメソッドを続けて呼び出すことができ、チェーンクエリを構成します。
すべてのアクティブな管理者ユーザーをクエリします:
admin_user = User.objects.filter(is_active__exact=1).
filter(is_superuser__exact=1)
return HttpResponse("Hello World。" + admin_user[0].username)
values メソッドを使用して辞書型の結果を取得します:
values メソッドにパラメータを渡して、SELECT のクエリ範囲を制限できます。
以下は id と title の列の結果のみを返します:
topic = Topic.objects.values('id', 'title')
return HttpResponse("Hello World。" + topic[0]['title'])
4. RawQuerySet を返すクエリメソッド
Manager は raw メソッドを提供しており、ネイティブ SQL 文を使用して Model をクエリできます。
topic = Topic.objects.raw('SELECT id, content FROM post_topic WHERE title = %s', ['Great China'])
return HttpResponse("Hello World。" + topic[0].content)
5. その他の型のクエリメソッドを返す
QuerySet 内のオブジェクト数を返します:
topic_count = Topic.objects.filter(id__gt=1).count()
return HttpResponse("Hello World。" + str(topic_count))
QuerySet にオブジェクトが含まれているかどうかを判定します:
update メソッドを使用して Model インスタンスを更新します:
Topic.objects.filter(id=1).update(title='Chinese')
delete メソッドを使用して Model インスタンスを削除します:
Topic.objects.filter(id=2).delete()
6. 関連リレーションシップを持つクエリ
クロスリレーションシップクエリ:
Topic をクエリする際に User を考慮する場合があります。これは非常に一般的なシナリオで、クロス関連クエリとも呼ばれます。
たとえば、関連する User の username に min が含まれる Topic のコレクションをクエリします:
topic = Topic.objects.filter(user__username__contains='min')
このクエリに深さの制限はありません:
たとえば、クエリ対象の Topic に関連する User の中で、username が admin に等しいものを取得します:
Model の逆引きクエリ:
Django のすべてのリレーションシップで逆引きクエリを実装できます。
たとえば、id=1 の User オブジェクトに関連する Topic 情報をクエリします:
user = User.objects.get(id=1)
topic = user.topic_set.all()
ManyToManyField や OneToOneField のリレーションシップ型でも同様の逆引きクエリを実装できますが、OneToOneField の逆引きは特殊です。その manager はオブジェクトのコレクションではなく単一のオブジェクトを表し、名前は小文字の Model 名になります。
たとえば、前述の CustomUser はその user フィールドと Django の User との間に OneToOneField のリレーションシップがあります。その場合、User は次のように逆引きクエリを実装できます:
本文を読む前に、この記事のデータテーブル構造を参照してください。
save メソッドを使用して Model インスタンスを作成します。
Topic には User オブジェクトが必要なため、まず username が admin(スーパーユーザー)の User オブジェクトを取得してから、Topic オブジェクトを作成します。
user = User.objects.get(username='admin')
topic = Topic(title='Great China', content='Long live the motherland。', user=user)
topic. save()
2. 単一インスタンスを返すクエリメソッド
get を使用したクエリ:
topic = Topic.objects.get(id=1, title=u'Great China')
return HttpResponse("Hello World。" + topic. content)
get_or_create を使用したクエリ:
クエリ対象のインスタンスが存在しない場合、get_or_create メソッドは新しいインスタンスオブジェクトを作成します。
get との違いは、(object, created) のタプルオブジェクトを返す点です。最初の要素がインスタンスオブジェクト、2 番目の要素が返されたインスタンスオブジェクトが新規作成されたかどうかを示すブール値です。
3. QuerySet を返すクエリメソッド
複数のデータレコードを返す必要がある場合は、QuerySet オブジェクトを使用します。
QuerySet の非常に重要な特徴は遅延読み込みです。つまり、実際に使用されるときに初めてデータベースにアクセスしてレコードを取得します。
all メソッドを使用してすべてのデータレコードを取得します:
all_topic = Topic.objects.all()
return HttpResponse("Hello World。" + all_topic[0].content)
order_by メソッドを使用して照合順序をカスタマイズします:
order_by では複数のソートフィールドを指定できます。たとえば、すべての Topic オブジェクトをまずタイトルで逆順ソートし、次に created_time で昇順ソートします:
all_topic = Topic.objects.order_by('-title', 'created_time')
filter メソッドを使用してデータレコードを絞り込みます:
filter メソッドを使う前に、条件付きクエリのキーワードを確認しましょう:
contains、startswith、endswith のキーワードには、大文字小文字を無視する対応バージョンもあります。キーワードの前に i を付けるだけです。たとえば icontains のようになります。
id=1 の Topic をクエリします:
all_topic = Topic.objects.filter(id__exact=1)
チェーンクエリ:
filter や exclude などのメソッドが返す結果は QuerySet であるため、その後に filter や exclude などのメソッドを続けて呼び出すことができ、チェーンクエリを構成します。
すべてのアクティブな管理者ユーザーをクエリします:
admin_user = User.objects.filter(is_active__exact=1).
filter(is_superuser__exact=1)
return HttpResponse("Hello World。" + admin_user[0].username)
values メソッドを使用して辞書型の結果を取得します:
values メソッドにパラメータを渡して、SELECT のクエリ範囲を制限できます。
以下は id と title の列の結果のみを返します:
topic = Topic.objects.values('id', 'title')
return HttpResponse("Hello World。" + topic[0]['title'])
4. RawQuerySet を返すクエリメソッド
Manager は raw メソッドを提供しており、ネイティブ SQL 文を使用して Model をクエリできます。
topic = Topic.objects.raw('SELECT id, content FROM post_topic WHERE title = %s', ['Great China'])
return HttpResponse("Hello World。" + topic[0].content)
5. その他の型のクエリメソッドを返す
QuerySet 内のオブジェクト数を返します:
topic_count = Topic.objects.filter(id__gt=1).count()
return HttpResponse("Hello World。" + str(topic_count))
QuerySet にオブジェクトが含まれているかどうかを判定します:
update メソッドを使用して Model インスタンスを更新します:
Topic.objects.filter(id=1).update(title='Chinese')
delete メソッドを使用して Model インスタンスを削除します:
Topic.objects.filter(id=2).delete()
6. 関連リレーションシップを持つクエリ
クロスリレーションシップクエリ:
Topic をクエリする際に User を考慮する場合があります。これは非常に一般的なシナリオで、クロス関連クエリとも呼ばれます。
たとえば、関連する User の username に min が含まれる Topic のコレクションをクエリします:
topic = Topic.objects.filter(user__username__contains='min')
このクエリに深さの制限はありません:
たとえば、クエリ対象の Topic に関連する User の中で、username が admin に等しいものを取得します:
Model の逆引きクエリ:
Django のすべてのリレーションシップで逆引きクエリを実装できます。
たとえば、id=1 の User オブジェクトに関連する Topic 情報をクエリします:
user = User.objects.get(id=1)
topic = user.topic_set.all()
ManyToManyField や OneToOneField のリレーションシップ型でも同様の逆引きクエリを実装できますが、OneToOneField の逆引きは特殊です。その manager はオブジェクトのコレクションではなく単一のオブジェクトを表し、名前は小文字の Model 名になります。
たとえば、前述の CustomUser はその user フィールドと Django の User との間に OneToOneField のリレーションシップがあります。その場合、User は次のように逆引きクエリを実装できます:
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
