溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

update()與save()的區(qū)別有哪些

發(fā)布時間:2020-09-09 15:05:45 來源:億速云 閱讀:569 作者:小新 欄目:編程語言

小編給大家分享一下update()與save()的區(qū)別有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

update()與save()的區(qū)別

兩者都是對數(shù)據(jù)的修改保存操作,但是save()函數(shù)是將數(shù)據(jù)列的全部數(shù)據(jù)項全部重新寫一遍,而update()則是針對修改的項進行針對的更新效率高耗時少。

所以以后對數(shù)據(jù)的修改保存用update()

讓我們通過orm對數(shù)據(jù)庫操作時候,讓終端顯示內(nèi)部查詢操作sql語句:

在Django項目的settings.py文件中,在最后復制粘貼如下代碼:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

配置好之后,再執(zhí)行任何對數(shù)據(jù)庫進行操作的語句時,會自動將Django執(zhí)行的sql語句打印到pycharm終端上

補充:

除了配置外,還可以通過一點query即可查看查詢語句,具體操作如下:

update()與save()的區(qū)別有哪些

only 與 defer

拿到的是一個對象  兩者是相反的

(前提設置:設置每次操作數(shù)據(jù)庫時候都會有sql語句現(xiàn)實在pycharm終端,上面已說明步驟)

先看看only:

update()與save()的區(qū)別有哪些

看看defer

update()與save()的區(qū)別有哪些

choice屬性

choice這個屬性,用來限制用戶做出選擇的范圍。比如說性別的選擇(男或女)

 class MyUser(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    choices = ((1, '男'), (2, '女'), (3, '其它'))
    gender = models.CharField(choices=choices, default=1, max_length=5)

choice接收一個元組(保證值不可變),同理每一個選項也是由一個元組(value,display_name)構成。顯而易見,display_name就是要在頁面中展示的。

如何取到value和displayname?

比如說實例一個User對象user_obj,

user_obj.gender = value  (通過屬性取value)

user_obj.get_gender_display() = display_name  (通過 get_屬性_display()方法取display_name)

在模板中可以通過模板語言{{ user_obj.gender }}很簡單地顯示value,但不能直接調(diào)用get屬性_display方法(模板畢竟是模板語言),要解決這個問題,可以用自定義過濾器來搞定:

來回顧一下如何自定義過濾器:

1,在應用名下新建一個名為templatetags文件夾

2,在該文件夾內(nèi)新建一個py文件,名字隨意

3,在該py文件內(nèi)添加固定代碼和自定義過濾器代碼

from django import template
register = template.Library()
@register.filter(name='displayName')
def displayName(obj):
    res = obj.get_gender_display
    return res()
# 視圖層:
from django.shortcuts import render, HttpResponse,reverse
# Create your views here.
from app01 import models
def index(request):
    obj = models.MyUser.objects.filter(pk=1).first()
    return render(request, 'index.html', locals())
# 前端(html頁面):
{% load my_file %}
{{ obj|displayName}}

bulk_create批量插入數(shù)據(jù)

當我們使用orm來一次性新增很多表記錄的時候,等待結果的時間會非常的慢,如果一次性需要批量插入很多數(shù)據(jù)的時候就需要使用bulk_create來批量插入數(shù)據(jù)。

import random
user_list = ['用戶[{}]'.format(i) for i in range(100)]
data = []
for j in user_list:
    data.append(models.MyUser(name=j, password='123', gender=str(random.choice([1, 2, 3]))))
models.MyUser.objects.bulk_create(data)

select_related和prefetch_related

def select_related(self, *fields)
    性能相關:表之間進行join連表操作,一次性獲取關聯(lián)的數(shù)據(jù)。
    總結:
    1. select_related主要針一對一和多對一關系進行優(yōu)化。
    2. select_related使用SQL的JOIN語句進行優(yōu)化,通過減少SQL查詢的次數(shù)來進行優(yōu)化、提高性能。
def prefetch_related(self, *lookups)
    性能相關:多表連表操作時速度會慢,使用其執(zhí)行多次SQL查詢在Python代碼中實現(xiàn)連表操作。
    總結:
    1. 對于多對多字段(ManyToManyField)和一對多字段,可以使用prefetch_related()來進行優(yōu)化。
    2. prefetch_related()的優(yōu)化方式是分別查詢每個表,然后用Python處理他們之間的關系。

update()與save()的區(qū)別有哪些

看完了這篇文章,相信你對update()與save()的區(qū)別有哪些有了一定的了解,想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI