Django 2.1.7クエリデータはjsonフォーマットの実現に戻ります。


需要問題
日常の作業では、フロントエンドからの要求に対して、バックエンドdjangoはほとんどjson形式で戻ります。テンプレートを使ってビューに戻る方法もあります。
テンプレートでビューに戻る方法は確かに便利ですが、動静分離、ajax要求などがあれば、djangoはjson形式のデータに戻るしかないです。
そこで、djangoをデータベースモデルクラスから調べたデータをjson形式でフロントエンドに戻すにはどうすればいいかという問題を持ってきました。
そして先端が読み取って戻ってきたデータを取得すると?
環境の説明
  • フロントエンドは、jqueryを用いてajax要求
  • を送信する。
  • python 3.7.2
  • django 2.7
  • 例をあげて説明する
    この例はまず、簡単なページを書いてajax要求を送信し、バックエンドはどのように複数の行のデータを返すかを説明します。
    フロントエンドコード
    まず、簡単なフロントエンドページtest_ajax.htmlを作成します。
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <script src="/static/js/jquery-3.0.0.min.js"></script>
      <script>
        $(function () {
          $('#search_server').click(function () {
            //        
            var server_name = $('#server_name').val();
            console.log('server_name = ' + server_name);
     
            //   ajax post  
            $.ajax({
              url: "/assetinfo/test_ajax",
              type: 'POST',
              data: {
                "tag": "search_project",
                "server_name": server_name,
              },
              dataType: "json",
              async: false,
              //          
              success: function (data) {
                console.log(data);
              },
              //           
              error: function () {
                alert("          ");
              }
     
            })
          })
        })
      </script>
    </head>
    <body>
     
    <input type="text" id="server_name">
    <button id="search_server">  </button>
     
     
    </body>
    </html>
    実現した機能は簡単で、入力ボックスの内容だけを取得して、提出ボタンをクリックしてajaxのpost要求を送信すればいいです。
    バックグラウンドは直接サーバーの情報を調べて、複数のjsonデータを返します。
    クラスビューのコードを以下のように実現します。
    
    from django.core import serializers
    from django.http import HttpResponse
    from assetinfo.models import ServerInfo
     
    # ex: /assetinfo/test_ajax
    class TestAjax(View):
     
      def get(self,request):
        """  html  """
        return render(request,'assetinfo/test_ajax.html')
     
      def post(self,request):
        """    ajax post  """
        servers = ServerInfo.objects.all() #        
        json_data = serializers.serialize('json', servers) #        json   
        return HttpResponse(json_data, content_type="application/json") #   json  
    バックグラウンドコードでは、post要求のパラメータを取得していません。パラメータクエリーの操作を行います。このように、Json形式のデータを返す方法だけを示します。
    ここで、post要求パラメータを取得する方法は簡単であり、依然としてrequest.POST.get(' ')であればよい。
    ブラウザテスト機能は以下の通りです。

    ブラウザのコンソールからバックエンドが戻ってくる結果データを見ることができます。
    しかし、このように直接フロントエンドに戻るのは、タスクの制約がないので、フロントエンドとの相互作用に関するフォーマット制約を追加します。
    前後端制約がデータフォーマットに戻ります。
    
     {"resCode": '0', "message": 'success',"data": []}
    この制約フォーマットに従って、クエリーの結果はdataの配列に置くべきである。バックエンドビューコードを変更します。
    バックエンドは制約されたフォーマットでJsonデータに戻ります。
    
    from django.core import serializers
    from django.http.response import JsonResponse
    from assetinfo.models import ServerInfo
     
    # ex: /assetinfo/test_ajax
    class TestAjax(View):
     
      def get(self,request):
        """  html  """
        return render(request,'assetinfo/test_ajax.html')
     
      def post(self,request):
        """    ajax post  """
     
        #           
        result = {"resCode": '0', "message": 'success',"data": []}
     
        #        
        servers = ServerInfo.objects.all()
     
        #      Python   
        result["data"] = serializers.serialize('python', servers)
     
        return JsonResponse(result)
    ブラウザのテストは以下の通りです。

    このようにフロントエンドに戻ると、各データオブジェクトはfields、model、pkの3つのオブジェクトを含み、それぞれフィールド、モデル、キーを表します。すべてのフィールドだけを含む辞書オブジェクトが欲しいです。
    バックエンドを修正し、各modelオブジェクトをdict辞書オブジェクトに変換します。
    
    from django.core import serializers
    from django.http.response import JsonResponse
    from django.forms.models import model_to_dict
     
    # ex: /assetinfo/test_ajax
    class TestAjax(View):
     
      def get(self,request):
        """  html  """
        return render(request,'assetinfo/test_ajax.html')
     
      def post(self,request):
        """    ajax post  """
     
        #           
        result = {"resCode": '0', "message": 'success',"data": []}
        #        
        servers = ServerInfo.objects.all()
     
        #  model      dict  ,     data list 
        for server in servers:
          server = model_to_dict(server) # model   dict  
          server['server_used_type_id'] = serializers.serialize('python', server['server_used_type_id']) #            ,       
          result["data"].append(server)
     
        return JsonResponse(result)
    ブラウザのテストは以下の通りです。

    このようにフロントエンドに渡すと辞書の対象になります。
    最後に、フロントエンドjsがjsonフォーマットデータを遍歴する例を与える。
    フロントエンドを巡回して返したJsonフォーマットのデータ例
    
    <script>
        $(function () {
          $('#search_server').click(function () {
            ....
     
            //   ajax post  
            $.ajax({
              url: "/assetinfo/test_ajax",
              type: 'POST',
              data: {
                "tag": "search_project",
                "server_name": server_name,
              },
              dataType: "json",
              async: false,
              //          
              success: function (res) {
                {#console.log(res.data);#}
                //   data  
                for(var i=0;i<res.data.length;i++){
                  console.log(res.data[i]);
                  console.log(res.data[i]['server_hostname']);
                  console.log(res.data[i]['server_internet_ip']);
                  console.log(res.data[i]['server_intranet_ip']);
                }
              },
              //           
              error: function () {
                alert("          ");
              }
     
            })
          })
        })
      </script>
    ブラウザは次のように表示されます。

    ここでは、Django 2.17クエリのデータをjson形式の実現に戻る記事を紹介します。これまでの記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。