この記事では、Django DetailView について学びます。
Django の DetailView とは何ですか?
Django DetailView は、モデルテーブルから単一のインスタンスを表示するタイプのビューを指します。
これは、データベースから単一のエントリに関する情報を表示し、また、そのインスタンスに対して異なるタスクを実行するために使用されます。
Django DetailView のための前提条件
このトピックの前提条件は、ListView の記事で挙げたものと全く同じです。
前提条件のコードは下に追加されているので、それを見てみてください。
もし説明が必要だと感じたら、 ListView の記事で挙げた前提条件に目を通してから、ここで Django の詳細ビューを作成することができます。
Model.py の ItemModel
class ItemModel(models.Model):
id = models.IntegerField(primary_key = True )
name = models.CharField(max_length = 80 , blank = False )
price = models.IntegerField
class Meta:
ordering = [ 'name' ]
def __str__( self ):
return f "{self.name}:{self.price}"
|
Serializers.py の ItemSerializer
from rest_framework import serializers
from .models import ItemModel
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = ItemModel
fields = [ 'id' ,name ',' price']
|
詳細表示用URLエンドポイント
また、Detail ViewsはDBから特定のidを持つインスタンスのみを表示することにフォーカスしているため、エンドポイントは単純に/item/となります。
URLマッピングのコードです。
path('item/<id>', ItemView.as_view()) |
以上で、2種類の方法でDetail Viewを作成する方法を学びます。
詳細ビューのコードロジック
前回の記事でListViewのロジックを見ました。
詳細ビューにも、エンドポイントリクエストからを取得し、さらに必要なタスクを実行するロジックがあります。
これはListViewと似ていますが、ここではエンドポイントデータを扱っているため、基本的な形式がいくつか変更されています。
まず、エンドポイントデータを取得します。
これは基本的に、ユーザーがリクエストと一緒に送信するアイテムIDです。
サーバーとユーザーとのやりとりのためのコードロジック
ロジックはシンプルで、以下のステップを経て理解することができます。
-
- 前もって取得したidを使用して、DBからアイテム情報を取得します。
-
- シリアライザーを使って、情報を JSON 形式に変換します。
-
- テンプレートまたはJSONとして直接ユーザーに表示します。
基本的なフローチャートは以下の通りです。
@csrf_exempt def ItemView(request,nm):
try :
item = ItemsModel.objects.get( id = nm)
except ItemsModel.DoesNotExist:
raise Http404( 'Not found' )
if request.method = = 'GET' :
serializer = ItemSerializer(item)
return JsonResponse(serializer.data)
if request.method = = 'PUT' :
data = JSONParser().parse(request)
serializer = ItemSerializer(item,data = data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status = 400 )
if request.method = = "DELETE" :
item.delete()
return HttpResponse(status = 204 )
|
ユーザーとサーバーの対話のためのコードロジック
このロジックは、上のセクションで行ったことの逆を行くようなものです。
-
- 残りのリクエストからJSONデータを分離(パース)します。
- ユーザから受け取った JSON データは、シリアライザーを使って Django で読める形式 (python-dictionary) に変換されなければなりません。
- エンドポイントリクエストで送信された ID を持つアイテムに必要な変更 (追加、編集、削除) を行います。
基本的なフローチャートは以下の通りです。
class ItemView(APIView):
def get_objects( self ,nm):
try :
return ItemsModel.objects.get( id = nm)
except ItemsModel.DoesNotExist:
raise Http404( 'Not found' )
def get( self ,request,nm, format = None ):
item = self .get_objects(nm)
serializer = ItemSerializer(item)
return JsonResponse(serializer.data)
def put( self ,request,nm, format = None ):
item = self .get_objects(nm)
data = JSONParser().parse(request)
serializer = ItemSerializer(item,data = data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
def delete( self ,request,nm, format = None ):
item = self .get_objects(nm)
item.delete()
return HttpResponse(status = status.HTTP_204_NO_CONTENT)
|
Django の DetailView を作成する
1. 関数ベースの詳細表示
ここでは、関数ベースのDetailViewのサンプルコードを紹介します。
上記のDetailViewのAPIで行う手順を覚えて、コードを理解してください。
- エンドポイントリクエストからidを取得する
- try-exceptブロック:アイテムが存在する場合は、DBからオブジェクトの情報を取得し、変数itemに保存します。
- def GET: 変数itemをJSONに変換(シリアライザー) →JSONデータ表示
- def PUT: リクエストを解析してJSONデータを分離 →Python形式に変換 →DBにあるアイテムに関するデータを更新
- def DELETE: 項目をDatabaseから削除します。
2. クラスベースの詳細ビュー
クラスを使用すると、コードがより体系的、構造的、かつ読みやすくなるため、クラスベースのビューは関数ビューよりも優れています。
ここでは、クラスベースのDetailViewのサンプルコードを紹介します。
ここでも、コードの書き方が変わるだけです。
クラスメソッドとクラス内関数(ここではtry-exceptブロックは別のクラス関数の中にある)を使ってコードを書いています。
しかし、ロジックの根幹は変わりません。
DetailView APIの実装
これで終わりです。
コードはほぼ完成したので、このデモのためにいくつかのテストを実行するときが来ました。
関数ベースとクラスベースの両方のビューを実行してみましょう。
REST APIを実行するためにPOSTMANを使用することにします。
POSTMANの公式サイトには、このツールの利点について書かれています。
では、ここからデモを進めていきましょう。
上のスクリーンショットでは、GETが動作している様子を見ることができます。
データベースから取り出した「id 1」のデータを表示しています。
上のスクリーンショットはPUTの例です。
その上でDELETEコマンドを実行すると、コマンドの出力がどのように見えるか見てみましょう。
まとめ
以上、皆さん! これが Django の DetailView が行うことです。
リクエストデータ()に基づいてモデルから単一のインスタンスを取得し、それを表示し、DBからアイテムのインスタンスを追加、編集、削除します。
このような興味深いトピックをもっと見るために、ご期待ください! ご安全に