C.R.U.D with Django 2 [Wecode][210820]


前回の記事に続いて、DjangoのCRUDについてもっと知りたいと思います.
<ディレクトリ>
Httpieって何?
2.HTTP通信に基づくデータストリーム
3. Post & Get Method
4. Views & Urls.pyの作成

Httpieって何?


HttpieはPythonで開発したhttpクライアントユーティリティです.説明は難しいが,CLIを用いてHTTP通信接続サーバを用いて動作可能なツールとして定義できることが最も簡単である.
詳細については、リンクHttpieを参照してください.

Httpieの利点

  • リクエストと応答がどのように送信されたかを確認できます.
  • Jsonタイプをサポートする機能を内蔵.
  • 出力をフォーマット表示し、読みやすさに優れています.
  • Formとファイルのアップロードは簡単です.
  • インストール方法と使い方を簡単に理解してください.

    Httpieのインストール方法

    $ brew install httpie

    Httpieの使い方

    $ http [flags] [METHOD] URL [ITEM [ITEM]]
  • flags:ランタイム転送のオプション-冒頭に,-v,-a,-jsonなどがある.
  • メソッド:Httpメソッドを入力します.入力されていない場合はGetメソッドを受け入れます.
  • URL:使用するURL
  • を入力
    具体的な使い方は後で他の文章を整理する際に知りたいので参考にしてください.

    2.Http通信に基づくデータストリーム


    基本的なHttp通信に基づくデータストリームを以下に示す.
    HTTP通信により、クライアント(chrome、postman、httpie)を使用してサーバに直接要求し、Djangoで作成されたアプリケーションコードを実行し、データベースからデータのロード、作成、変更、削除を行います.
    これを画像で以下のように表現します.

    また,倉庫サーバ全体とHTTP request&レスポンスを記述する流れは以下の通りである.
    クライアントのHTTPリクエスト(GET https://10.58.4.1/products)を解析し、処理リクエストのロジック(views.py)を実行し、データベースと通信(models.py)し、データ操作を実行し、リクエストに合致するHTTP応答をクライアントに送信する.

    3. Post & Get Method


    Hotpieの中で最も基本的で最も重要な方法:PostとGetを知りたいです.
    Postメソッドは,ユーザがデータの入力を要求すると,入力したデータをデータベースに保存できるメソッドである.
    Getメソッドは、現在のデータベースのデータが要求されたときに呼び出されるメソッドです.
    百聞は一見にしかず、下は実際のビューです.pyを作成し、端末でPost&Getメソッドを使用しようとします.

    4. Views & Urls.pyの作成


    Post&Getメソッドを使用する前に、私が作成したViews.py & Urls.pyコードは以下の通りです.
    # Views.py
    from django.shortcuts import render
    
    # Create your views here.
    
    import json
    
    from django.http     import JsonResponse
    from django.views    import View
    
    from products.models import Owner, Dog
    
    class SampleView(View):
        def post(self, request):
            data = json.loads(request.body)
            owner = Owner.objects.create(
                name=data['owner'],
                email=data['email'], 
                age=data['age'], 
            )
    
            return JsonResponse({'MESSAGE':'CREATED'}, status=201)
    
        def get(self, request):
            owners = Owner.objects.all()
            results = []
            for owner in owners:
                dog_list = []
                dog_infos = owner.dog_set.all()
                for dog_info in dog_infos:
                    dog_list.append(
                        {
                            "dog_name" : dog_info.name,
                            "dog_age" : dog_info.age,
                        }
                    )
    
                results.append(
                    {
                        "owner_name" : owner.name, 
                        "email" : owner.email,
                        "owner_age" : owner.age,
                        "dog_information" : dog_list, 
                    }
                )
    
            return JsonResponse({'results':results}, status=200)
    
    class DogView(View):
        def post(self, request):
            data = json.loads(request.body)
            dog = Dog.objects.create(
                name=data['dog'],
                owner=Owner.objects.get(name=data['owner']),
                age=data['dog_age'],
            )
    
            return JsonResponse({'MESSAGE':'CREATED'}, status=201)
    
        def get(self, request):
            dogs = Dog.objects.all()
            results = []
            for dog in dogs:
                results.append(
                    {
                        "dog_name" : dog.name,
                        "owner" : dog.owner.name, 
                        "dog_age" : dog.age
                    }
                )
            return JsonResponse({'resutls':results}, status=200)
    # Urls.py (main, 상위폴더에 있는 Urls.py)
    
    from django.urls import path, include
    
    urlpatterns = [
        path('products/', include('products.urls')),
    ]
    # Urls.py (하위 앱폴더에 있는 Urls.py)
    
    from django.urls import path
    
    from products.views import SampleView
    from products.views import DogView
    
    urlpatterns = [
    	path('', SampleView.as_view()),
        path('dog/', DogView.as_view()), 
    ]
    Views.py, Urls.pyコードも書き終わったので、Post&Getメソッドを使い始めます.
    既存のデータを下図に示します.

    ここに主人と犬を2匹追加します.
    入力コードは以下の通りです.
    $ http -v POST 127.0.0.1:8000/products/ owner='Obama' email='[email protected]' age=63
    
    $ POST 127.0.0.1:8000/products/dog/ dog='Jindo' owner='Obama' dog_age=3
    
    $ http -v POST 127.0.0.1:8000/products/dog/ dog='Sabsal' owner='Obama' dog_age=4
    入力コードの結果は次のスクリーンショットで、最後の写真のように入力データが正しいか確認できます.


    最後にGetメソッドを使用して保存したデータを出力してみます.
    データをインポートするコードは以下の通りです.
    # SampleView 사용하여 주인 정보 출력
    $ http -v GET 127.0.0.1:8000/products/
    
    # DogView 사용하여 개 정보 출력
    $ http -v GET 127.0.0.1:8000/products/dog/
    このコードの出力値は以下のとおりです.



    SampleViewを使用して、読み込まれたマスターデータの結果値を表示すると、マスターが所有している子犬のすべてのデータ情報が二重に含まれていると判断できます.これは、2つのデータの所有者&子犬が1対1の関係で作成されたテーブルであるため、可能性のある言い方はこのようになり、後で単独で位置決めします.(Many to Many関係付き)
    では20000~