(Day55)七、クエリの最適化、MTVとMCV、選択肢、AJAX、シリアライズ

A、ORMのクエリの最適化

だけ延期する(A)

(1)のみ

  1. 括弧に入れてオブジェクトフィールドのクエリセットは、データオブジェクトのフィールドの値のみが含ま返しますデータオブジェクトが含まれています
  2. また、クエリの他のフィールドことができますが、データソースがデータベースに再探している、非常に低い効率
res = models.Book.objects.only('title')

(2)延期

  1. オブジェクトをチェックアウト延期、他のフィールド値は、フィールドに加えて、含まれてい
  2. また、クエリの他のフィールドことができますが、データソースは、フィールドの値に戻って取得するためのデータベース検索です
res = models.Book.objects.defer('title')
  1. 括弧内の外部キーフィールドだけを入れ、外部キータイプのみ一から一、多くのいずれかを指定でき、多くの多くではありません
  2. データベースへのアクセスは、元のテーブルと外部キーテーブルをチェックアウトして行くために必要とされていないクエリの外部キーテーブルそう
  3. 場合は、データの多くは、時間がかかり、テーブル
res = models.Book.objects.select_related('publish')
for i in res:
    # print(i.title)
    print(i.publish)
  1. のみ(複数を置くことができる)、外部キーフィールドかっこを入れて、サブクエリの同等、手順クエリを複数のテーブルに従います
  2. アクセスデータベースはより頻繁に、それぞれが外部キーフィールドを入れて、より多くの時間のデータベースへのアクセスがあるでしょう
res = models.Book.objects.prefetch_related('publish','authors')
for i in res:
    # print(i.title)
    print(i.publish)

二、MTVとMVCモデル

  1. MTVは、実際に、それはMVCの本質である、ジャンゴフレームワークに主張しています
  2. MTV:ウェブモデルにアプリケーション(モデル)、鋳型(テンプレート)、ビュー(ビュー)の3つは、プラグ状で、一緒にそれらの間の疎結合を接続します。
    1. モデル(モデル):ビジネス・オブジェクトとデータベース・オブジェクトの責任(ORM)
    2. テンプレート(テンプレート):ページがユーザーに表示さどのように責任
    3. ビュー(ビュー):ビジネス・ロジックを担当し、かつ適切な時期にモデルとテンプレートを呼び出します
  3. MVC:モデルにWebアプリケーション(モデル)、制御(コントロール)、ビュー(ビュー)の3つは、プラグ状で、一緒にそれらの間の疎結合を接続します。
    1. ビジネス・オブジェクト・モデルとデータベースオブジェクト(ORM)を担当
    2. Viewは、ユーザ(ページ)との相互作用のために責任があります
    3. コントローラ(C)コールモデルを完了し、ユーザの要求を表示し、ユーザー入力を受け付けます。

三、選択肢パラメータ

  1. .get_字段名_display:統一された文の対応する数字は立派な取得、またはデジタルのみを取得することができます
  2. これは、デジタルスチルを取得するためには対応しておりません。
# models.py
class User(models.Model):
    username = models.CharField(max_length=64)
    password = models.IntegerField()
    gender_choices = (
        (1,'男'),
        (2,'女'),
        (3,'其他'),
    )
    gender = models.IntegerField(choices=gender_choices)
    
# test.py  
user_obj = models.User.objects.get(pk=1)
user_obj1 = models.User.objects.get(pk=4)

print(user_obj.gender)  # 1
print(user_obj1.gender)  # 4
print(user_obj.get_gender_display())  # 男
print(user_obj1.get_gender_display())  # 4

四、AJAX

(A)JSONとXML

(1)JSONとは何ですか

  1. JSONはJavaScriptオブジェクト表記法(JavaScript Object Notation)は指し
  2. JSONは軽量のデータ交換形式のテキストです
  3. JSON言語に依存しません*
  4. JSONの自己記述がよりよく理解します

JSONは、データオブジェクトを記述するために、JavaScriptの構文を使用していますが、JSONはまだ言語やプラットフォームに依存しないです。JSONパーサーとJSONライブラリは、多くの異なるプログラミング言語をサポートしています。

(2)JSONの使用

  • JavaScriptを
  1. シリアル化:JSON.stringify()
  2. デシリアライズ:JSON.parse()
  • パイソン
    1. シリアル化:json.dumps()
    2. デシリアライズ:json.loads()

(3)XML

  1. XMLはマークアップ言語である、(python2に応じて、エンタープライズ管理ソフトウェアの開発のためのフレームワークodoo)コンフィギュレーションファイルおよびフロントページを書くために適用することができ
  2. JSON形式は、2001年にダグラス・クロックフォードが提案し、その目的は、面倒なかさばるXMLフォーマットを交換することです

(B)AJAXとは何ですか

  1. 中国語に翻訳AJAX(非同期JavaScriptとXML)は、「非同期JavascriptとXML」です。JavaScript言語の使用は、XML用のサーバーの非同期データ伝送と対話すること(もちろん、データ伝送は単なるXMLではありません)
  2. 同期相互作用:クライアントが要求を送信し、それが第2の要求を送信する前にサーバの応答の終了を待たなければなりません。
  3. 非同期相互作用:クライアントは応答の終了を待たずにサーバにリクエストを送信するには、そのようなユーザー名のチェック再登録として、第2の要求を発行することができます
  4. AJAXは、新しいプログラミング言語ではなく、既存の標準を使用する新しい方法は、任意のブラウザプラグインを必要としませんが、ブラウザでのJavaScriptの実行を許可するようにユーザーに要求します
  5. 長所:ページ全体をリロードせずに、ページの内容(非同期相互作用)のサーバと更新部分とデータを交換することができます

(C)jQueryのAJAXを達成します

  1. $アヤックス({}):AJAX開口文文法
  2. URL:提出されたデータのバックエンドアドレス、現在のページに書いていないが、同じの役割と行動を提出しています
  3. タイプ:リクエスト方法、デフォルトの要求を取得
  4. データ:バックエンドデータに提出し、この時間は、のHttpResponseオブジェクトのページを返しますが、データと対話していません
  5. 成功:関数(データ){}:固定された文言、バックエンドから返されるデータのパラメータデータ
  6. is_ajax():AJAX要求するかどうか、それはブール値を返します。
<!--xxx.html-->
<script>
    $('#d4').on('click',function () {
        // 开启ajax语法
        $.ajax({
            url:'',  // 数据提交的后端地址  不写就是往当前页面提交  也可以写后缀 也可以写全称  跟actions一样
            type:'post',  // 提交方式  默认是get请求
            data:{'i1':$('#d1').val(),'i2':$('#d2').val()},  // 提交的数据
            success:function (data) {  // 形参data就是异步提交之后后端返回结果
                $('#d3').val(data)  // 回调机制需要做的事情#
                alert(data)
            }
        })
    })
</script>
# views.py
def xxx(request):
    # print(request.is_ajax())  # 判断当前请求是否是ajax请求
    # print(request.POST)  # ajax发送的post请求 普通的键值对也在request.POST中获取
    if request.is_ajax():
        # i1 = request.POST.get('i1')
        # i2 = request.POST.get('i2')
        # res = int(i1) + int(i2)
        # return HttpResponse(res)  # 给异步回调函数 success
        # return render(request,'xxx.html')  # 给异步回调函数 success
        return redirect('https://www.baidu.com')  # 给异步回调函数 success
    return render(request,'xxx.html')

(D)フォーマットをコードデータの転送前後

(1)urlencoded形式

  1. 対応するデータ形式username=wick&password=123、自動的に解析し、request.POSTにカプセル化されたDjangoのバックエンド
  2. AJAXフォームフォームとデフォルトのエンコード形式

(2)FORMDATAフォーマット

  1. ファイルを送信するために、ブラウザは、自動的に識別し、データ形式を表示できないとDjangoのrequest.FILESにカプセル化さ
  2. AJAXフォームとフォームを送信することができます

(3)アプリケーション/ JSON形式

フォームフォームはAJAXを通じて、フォームデータを送信することはできません

(E)アヤックス輸送JSON形式のデータとファイルデータ

(1)データ転送フォーマットJSON

  1. ジャンゴバックエンドJSONないプロセスデータ形式、および手動でシリアライズをデシリアライズする必要があります、
  2. contentType:'application/json',:データ型の書式を設定します
  3. data:JSON.stringify({'username':'jason','password':'123'}),:直列化されたデータ
<script>
    // 传json格式的数据
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            contentType:'application/json',
            data:JSON.stringify({'username':'jason','password':'123'}),
            success:function (data) {
                alert(123)
            }
        })
</script>

(2)転送ファイルデータ

  1. 生成組み込みオブジェクト:var MyFormData = new FormData();データオブジェクトは、ファイル、キーと値のペア、またサポートを転送することができます
  2. 追記:通常のキーまたはデータファイルを追加
  3. $('#d1')[0].files[0]:入力ボックスのファイルオブジェクト
  4. contentType:false,:オブジェクト内部MyFormData後端がエンコードジャンゴと認識することができます
  5. processData:false,:プロセスデータへの必要はありません
<script>
    // 传文件
    $('#d1').click(function () {
        // 先生成一个内置对象
        var MyFormData = new FormData();
        // 1. 先添加普通的键值
        MyFormData.append('username','jason');  // 添加了一组普通的简直对
        MyFormData.append('password','123');
        MyFormData.append('hobby',['read','run']);
        // 2. 添加文件数据
        MyFormData.append('myfile',$('#d2')[0].files[0]);  // 如何获取input框中文件对象$('#d1')[0].files[0]
        $.ajax({
            url:'',
            type:'post',
            data:MyFormData,

            // 发送文件必须要指定的两个参数
            contentType:false,  // MyFormData对象内部自带编码 django后端能够识别
            processData:false,  // 不要处理数据

            success:function (data) {
            }
        })
    })
</script>

(VI)(シリアライザ)の配列

  1. ORMデータオブジェクトをチェックアウトすることができ、すべてのフィールド値は自動的にデータ交換を容易にするため、クライアントへの辞書に統合されて送信
  2. テーブル名、主キー、パッケージの辞書に対応する値フィールドを含む辞書
def ser(request):
    # 1. 拿到用户表里面的所有的用户对象
    user_list=models.User.objects.all()
    # 2. 导入内置序列化模块
    from django.core import serializers
    # 3. 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
    ret=serializers.serialize('json',user_list)
    return HttpResponse(ret)

おすすめ

転載: www.cnblogs.com/wick2019/p/11967899.html