DjangoのListViewの使い方を解説していく

スポンサーリンク

今回は、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 ListView の背後にあるロジック

ListView API では、ロジックは非常にシンプルです。

1. サーバーからユーザーへのデータ表示

手順としては、以下のようになります。

  1. DBからデータを取得
  2. シリアライザーを使ってデータをJSONに変換する
  3. 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. ユーザーからサーバーへデータを取り込む

ここでの手順は、次のようになります。

  1. JSONデータをリクエストの残りから分離する(JSONパーサーを使用)
  2. Django-readable フォーマットに変換する(python メソッド)
  3. そのデータに対して、専用のタスク(追加、編集、削除)を実行します。

この場合、専用タスクは、ユーザーからのデータを表示するか、DBに追加するかだけです。

Admin
Admin

Django の ListView を作成する

それでは Django Listview を作成してみましょう。

1. 関数型ListView

ここでは、関数ベースのListViewのサンプルコードを紹介します。

上のセクションで説明したListViewのAPIを使った手順を覚えて、コードを理解してください。

  1. def get: DBからデータを取得 → JSONに変換(シリアライザー) →JSONデータを表示
  2. def post: リクエストを解析してJSONデータを分離 →Python形式に変換 →データに対して適切なTaskを実行

これが、ItemsViewのコードで、やったことです。

2. クラスベースのリストビュー

クラスを使用すると、コードがより体系的、構造的、かつ読みやすくなるため、クラスベースのビューは関数ビューよりも優れています。

クラスベースのListViewのサンプルコードは以下の通りです。

ここでも同様に、コードの書き方が変わるだけです。

クラスメソッドやクラス内関数を使ってコードを書いています。

しかし、ロジックの根幹は変わりません。

ListView APIの実装

コードが完成しましたので、これから実行します。

関数ベースとクラスベースの ListView を理解するために、関数ベースとクラスベースの両方を実行してみるとよいでしょう。

実行には、Django の REST API を効率的に実行する方法です POSTMAN を使用します。

POSTMAN の公式サイトはこちらです。

GET ListView
GET ListView

上の Pic は ListView の GET オプションで、ItemModel の全インスタンスを表示しています。

POST ListView
POST ListView

この図は ListView の POST オプションを示しており、ユーザーは新しいアイテムのインスタンスを ItemModel に追加することができます

まとめ

以上、皆さん! これが Django の ListView が行うことです。

モデルのインスタンスを取得して表示し、ユーザから新しいインスタンスを取 り込むこともできます。

次回は、 Django の詳細ビューについて学びます。

このような興味深いトピックをもっと見るために、ご期待ください! ごきげんよう!

タイトルとURLをコピーしました