电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Django數(shù)據(jù)庫操作之save與update的使用

瀏覽:4日期:2024-10-14 08:00:26

Python框架Django有著諸多優(yōu)點,它提供的models可以讓開發(fā)者方便地操作數(shù)據(jù)庫,但正是由于對上層的良好的封裝,使得提升數(shù)據(jù)庫操作性能必須要清楚地知道Django的數(shù)據(jù)庫操作到底執(zhí)行了哪些SQL語句。

例如數(shù)據(jù)更新操作,對單條記錄,可以使用save或者是update兩種方式

在Django工程下的settings.py下將log設(shè)置為DEBUG,即可查看save和update分別執(zhí)行了哪些SQL語句

如有一張表名叫做Example

使用save:

k = Example.objects.get(id=481)k.total_calories = 12k.save()

執(zhí)行的SQL語句如下所示:

SELECT (1) AS `a` FROM `Example` WHERE `Example`.`id` = 481 LIMIT 1; args=(481,)UPDATE `Example` SET `user_id` = asdfasdf, `event_id` = -1, `join_type` = 0, `name` = , `phone` = , `email` = , `company_name` = , `address` = , `if_type` = 0, `code` = , `location` = , `total_days` = 0, `total_length` = 0, `total_calories` = 12, `comments` = , `reserved_1` = , `reserved_2` = , `reserved_3` = , `reserved_4` = , `reserved_5` = , `create_datetime` = 2015-02-02 17:43:53 WHERE `Example`.`id` = 481 ; args=(u’asdfasdf’, -1, 0, u’’, u’’, u’’, u’’, u’’, 0, u’’, u’’, 0, 0, 12, u’’, u’’, u’’, u’’, u’’, u’’, u’2015-02-02 17:43:53’, 481)

首先要查詢k這條記錄,然后save()的時候提交更新的內(nèi)容,發(fā)現(xiàn)更新的時候把Example中的有字段都SET賦值的一次

使用update

Example.objects.filter(id=481).update(total_calories = 10)

執(zhí)行的SQL語句是:

UPDATE `Example` SET `total_calories` = 10 WHERE (`Example`.`user_id` = asdfasdfAND `Example`.`id` = 481 ); args=(10, u’asdfasdf’, 481)

這條SQL語句簡短而且執(zhí)行速度要優(yōu)于使用save的速度。

從SQL的執(zhí)行情況來看,使用upate是要優(yōu)于save方式的。

從使用情境上看,update更加適用于批量數(shù)據(jù)更新,而save則更適合當(dāng)然也只適合做單條記錄的數(shù)據(jù)更新操作了。

在使用Django的數(shù)據(jù)模型操作數(shù)據(jù)庫時,了解這些底層的SQL操作很有必要。

補充知識:如何理解Django的save(commit=False)方法和save_m2m()方法

什么時候使用save(commit=False)方法,save_m2m方法以及如何使用是Django表單forms進(jìn)階必需了解的知識。我們今天就帶你來看一看。

何時使用save(commit=False)方法

Stackoverflow上其實已經(jīng)有了一段非常精煉的答案。英文原文如下,我把它翻譯了一下:

That’s useful when you get most of your model data from a form, but need to populate some null=False fields with non-form data. Saving with commit=False gets you a model object, then you can add your extra data and save it.

當(dāng)你通過表單獲取你的模型數(shù)據(jù),但是需要給模型里null=False字段添加一些非表單的數(shù)據(jù),該方法會非常有用。如果你指定commit=False,那么save方法不會理解將表單數(shù)據(jù)存儲到數(shù)據(jù)庫,而是給你返回一個當(dāng)前對象。這時你可以添加表單以外的額外數(shù)據(jù),再一起存儲。

save(commit=False)方法實際應(yīng)用案例

下面我們來看一個實際應(yīng)用案例。我們創(chuàng)建了一個叫文章Article的模型,里面包含title, body和作者author等多個字段,其中author字段非空null=False。我們由Article模型創(chuàng)建了一個ArticleForm表單,可以讓用戶發(fā)表新文章,但是我們故意把author字段除外了,因為我們不希望用戶編輯作者。

最后用戶提交的表單數(shù)據(jù)里肯定沒有author,當(dāng)這樣的數(shù)據(jù)提交到數(shù)據(jù)庫時肯定會有問題的。所以我們先通過 article = form.save(commit=False)創(chuàng)建article實例,此時讓Django先不要發(fā)送數(shù)據(jù)到數(shù)據(jù)庫,等待我們把author添加好后,再把數(shù)據(jù)一起存儲到數(shù)據(jù)庫中。

下面是視圖文件views.py的代碼。最重要的是ArticleForm構(gòu)成和article_create方法。

from .models import Articlefrom django.forms import ModelFormfrom django.http import HttpResponseRedirectfrom django.shortcuts import renderclass ArticleForm(ModelForm): class Meta: model = Article exclude = [’author’]def article_create(request): if request.method == ’POST’: form = ArticleForm(request.POST) if form.is_valid(): article = form.save(commit=False) # commit=False告訴Django先不提交到數(shù)據(jù)庫. article.author = request.user # 添加額外數(shù)據(jù) article.save() # 發(fā)送到數(shù)據(jù)庫 return HttpResponseRedirect('/blog/') else: form = ArticleForm() return render(request, ’blog/article_create_form.html’, {’form’: form})

如果你使用Django自帶的基于類的視圖(CBV), 你可以使用form_valid方法完成上述同樣的操作。具體代碼如下。

from django.views.generic.edit import CreateViewfrom .models import Articlefrom django.forms import ModelForm# Create your views here.class ArticleForm(ModelForm): class Meta: model = Article exclude = [’author’] class ArticleCreateView(CreateView): model = Article form_class = ArticleForm template_name = ’blog/article_create_form.html’ # Associate form.instance.user with self.request.user def form_valid(self, form): form.instance.author = self.request.user return super().form_valid(form)

何時使用save_m2m方法及如何使用

save_m2m方法只用來存儲多對多的關(guān)系。當(dāng)你同時滿足下面兩個條件時,你需要使用此方法。如果你直接使用save()或form_valid()方法,是可以直接存儲多對多(m2m)關(guān)系的,不需要用save_m2m。

你使用了save(commit=False)方法

你的model里有多對多的關(guān)系(比如tags)

假設(shè)我們文章模型里有tags這個多對多的字段,我們的article_create方法需要增加一行。

def article_create(request): if request.method == ’POST’: form = ArticleForm(request.POST) if form.is_valid(): article = form.save(commit=False) # commit=False tells Django that 'Don’t send this to database yet. article.author = request.user # Set the user object here article.save() # Now you can send it to DB form.save_m2m() return HttpResponseRedirect('/blog/') else: form = ArticleForm() return render(request, ’blog/article_create_form.html’, {’form’: form})

以上這篇Django數(shù)據(jù)庫操作之save與update的使用就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 神马影院-实时更新秒播| 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 扬子叉车厂家_升降平台_电动搬运车|堆高车-扬子仓储叉车官网 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 同学聚会纪念册制作_毕业相册制作-成都顺时针宣传画册设计公司 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 泵阀展|阀门展|水泵展|流体机械展 -2025上海国际泵管阀展览会flowtech china | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 广西正涛环保工程有限公司【官网】| 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 超声波清洗机_大型超声波清洗机_工业超声波清洗设备-洁盟清洗设备 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 |