您好,登錄后才能下訂單哦!
小編給大家分享一下update()與save()的區別有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
update()與save()的區別
兩者都是對數據的修改保存操作,但是save()函數是將數據列的全部數據項全部重新寫一遍,而update()則是針對修改的項進行針對的更新效率高耗時少。
所以以后對數據的修改保存用update()
讓我們通過orm對數據庫操作時候,讓終端顯示內部查詢操作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', }, } }
配置好之后,再執行任何對數據庫進行操作的語句時,會自動將Django執行的sql語句打印到pycharm終端上
補充:
除了配置外,還可以通過一點query即可查看查詢語句,具體操作如下:
only 與 defer
拿到的是一個對象 兩者是相反的
(前提設置:設置每次操作數據庫時候都會有sql語句現實在pycharm終端,上面已說明步驟)
先看看only:
看看defer
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,但不能直接調用get屬性_display方法(模板畢竟是模板語言),要解決這個問題,可以用自定義過濾器來搞定:
來回顧一下如何自定義過濾器:
1,在應用名下新建一個名為templatetags文件夾
2,在該文件夾內新建一個py文件,名字隨意
3,在該py文件內添加固定代碼和自定義過濾器代碼
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批量插入數據
當我們使用orm來一次性新增很多表記錄的時候,等待結果的時間會非常的慢,如果一次性需要批量插入很多數據的時候就需要使用bulk_create來批量插入數據。
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連表操作,一次性獲取關聯的數據。 總結: 1. select_related主要針一對一和多對一關系進行優化。 2. select_related使用SQL的JOIN語句進行優化,通過減少SQL查詢的次數來進行優化、提高性能。 def prefetch_related(self, *lookups) 性能相關:多表連表操作時速度會慢,使用其執行多次SQL查詢在Python代碼中實現連表操作。 總結: 1. 對于多對多字段(ManyToManyField)和一對多字段,可以使用prefetch_related()來進行優化。 2. prefetch_related()的優化方式是分別查詢每個表,然后用Python處理他們之間的關系。
看完了這篇文章,相信你對update()與save()的區別有哪些有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。