今回は、Django ListViewsについて学びます。
Django ListView とは何ですか?
Django ListView は、モデルテーブル内に存在するインスタンス/要素を表示するタイプのビューを指します。
これは、Database に存在する複数のエントリを表示するために使われ、また、新しいデータを追加することも可能です。
したがって、ListView は GET と POST オプションを持つ API インターフェースに基づいていることが推測されます。
これは、連載 Django REST API で作成した ItemsView に似ています。
ListViewをコーディングするための前提条件
App Itemsapp を持つ Django プロジェクトを考えてみましょう。
ここでは、椅子、本、テーブルなどのアイテムの情報を保存する Model を用意します。
Model のコードは以下の通りです。
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}"
|
次に、ターミナルを使用して、あらかじめ設定されているデータベースSQLiteにテーブルを作成します。
python manage.py migrate python manage.py makemigrations python manage.py migrate |
その後、DBのインスタンスをJSONに変換するItemSerializerクラスを持つserializers.pyを作成します。
ItemSerializerのコードです。
from rest_framework import serializers
from .models import ItemModel
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = ItemModel
fields = [ 'id' ,name ',' price']
|
あとは、Pythonのシェルや管理サイトから、テーブルにアイテムを追加するだけです。
path ( 'items/' , ItemsView)
|
また、リストビューはモデルテーブルのインスタンス全体を表示することにフォーカスしているので、エンドポイントは単純に /items となります。
URLマッピングのコードです。
- 関数型リストビューの場合
path( 'items/' ,ItemView.as_view())
|
- クラスベースのリストビューの場合
@csrf_exempt def ItemsView(request):
if request.method = = 'GET' :
items = ItemsModel.objects. all ()
serializer = ItemSerializer(items, many = True )
return JsonResponse(serializer.data, safe = False )
elif request.method = = 'POST' :
data = JSONParser().parse(request)
serializer = ItemSerializer(data = data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data,status = 201 )
return JsonResponse(serializer.errors,status = 400 )
|
以上で、ListViewの作成方法を学びます。
この記事もチェック:DjangoでクラスベースでのViewを解説していく
Django ListView の背後にあるロジック
ListView API では、ロジックは非常にシンプルです。
1. サーバーからユーザーへのデータ表示
手順としては、以下のようになります。
- DBからデータを取得
- シリアライザーを使ってデータをJSONに変換する
- JSONデータをそのまま、またはテンプレート(JSを使用)を介してユーザーに返す
class ItemsView(APIView):
def get( self ,request, format = None ):
items = ItemsModel.objects. all ()
serializer = ItemSerializer(items, many = True )
return JsonResponse(serializer.data, safe = False )
def post( self ,request, format = None ):
data = JSONParser().parse(request)
serializer = ItemSerializer(data = data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data,status = status.HTTP_201_CREATED)
return JsonResponse(serializer.errors,status = status.HTTP_400_BAD_REQUEST)
|
2. ユーザーからサーバーへデータを取り込む
ここでの手順は、次のようになります。
- JSONデータをリクエストの残りから分離する(JSONパーサーを使用)
- Django-readable フォーマットに変換する(python メソッド)
- そのデータに対して、専用のタスク(追加、編集、削除)を実行します。
この場合、専用タスクは、ユーザーからのデータを表示するか、DBに追加するかだけです。
Django の ListView を作成する
それでは Django Listview を作成してみましょう。
1. 関数型ListView
ここでは、関数ベースのListViewのサンプルコードを紹介します。
上のセクションで説明したListViewのAPIを使った手順を覚えて、コードを理解してください。
- def get: DBからデータを取得 → JSONに変換(シリアライザー) →JSONデータを表示
- def post: リクエストを解析してJSONデータを分離 →Python形式に変換 →データに対して適切なTaskを実行
これが、ItemsViewのコードで、やったことです。
2. クラスベースのリストビュー
クラスを使用すると、コードがより体系的、構造的、かつ読みやすくなるため、クラスベースのビューは関数ビューよりも優れています。
クラスベースのListViewのサンプルコードは以下の通りです。
ここでも同様に、コードの書き方が変わるだけです。
クラスメソッドやクラス内関数を使ってコードを書いています。
しかし、ロジックの根幹は変わりません。
ListView APIの実装
コードが完成しましたので、これから実行します。
関数ベースとクラスベースの ListView を理解するために、関数ベースとクラスベースの両方を実行してみるとよいでしょう。
実行には、Django の REST API を効率的に実行する方法です POSTMAN を使用します。
POSTMAN の公式サイトはこちらです。
上の Pic は ListView の GET オプションで、ItemModel の全インスタンスを表示しています。
この図は ListView の POST オプションを示しており、ユーザーは新しいアイテムのインスタンスを ItemModel に追加することができます。
この記事もチェック:DjangoでREST APIの理論や実装を詳しく解説していく
まとめ
以上、皆さん! これが Django の ListView が行うことです。
モデルのインスタンスを取得して表示し、ユーザから新しいインスタンスを取 り込むこともできます。
次回は、 Django の詳細ビューについて学びます。
このような興味深いトピックをもっと見るために、ご期待ください! ごきげんよう!