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

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

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

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

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

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

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

如有一張表名叫做Example

使用save:

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

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

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()的時(shí)候提交更新的內(nèi)容,發(fā)現(xiàn)更新的時(shí)候把Example中的有字段都SET賦值的一次

使用update

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

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

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

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

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

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

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

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

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

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

Stackoverflow上其實(shí)已經(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)你通過(guò)表單獲取你的模型數(shù)據(jù),但是需要給模型里null=False字段添加一些非表單的數(shù)據(jù),該方法會(huì)非常有用。如果你指定commit=False,那么save方法不會(huì)理解將表單數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù),而是給你返回一個(gè)當(dāng)前對(duì)象。這時(shí)你可以添加表單以外的額外數(shù)據(jù),再一起存儲(chǔ)。

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

下面我們來(lái)看一個(gè)實(shí)際應(yīng)用案例。我們創(chuàng)建了一個(gè)叫文章Article的模型,里面包含title, body和作者author等多個(gè)字段,其中author字段非空null=False。我們由Article模型創(chuàng)建了一個(gè)ArticleForm表單,可以讓用戶發(fā)表新文章,但是我們故意把a(bǔ)uthor字段除外了,因?yàn)槲覀儾幌M脩艟庉嬜髡摺?/p>

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

下面是視圖文件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ù)庫(kù). article.author = request.user # 添加額外數(shù)據(jù) article.save() # 發(fā)送到數(shù)據(jù)庫(kù) return HttpResponseRedirect('/blog/') else: form = ArticleForm() return render(request, ’blog/article_create_form.html’, {’form’: form})

如果你使用Django自帶的基于類(lèi)的視圖(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)

何時(shí)使用save_m2m方法及如何使用

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

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

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

假設(shè)我們文章模型里有tags這個(gè)多對(duì)多的字段,我們的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ù)庫(kù)操作之save與update的使用就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 有福网(yofus.com)洗照片冲印,毕业聚会纪念册相册制作个性DIY平台 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 飞象网 - 通信人每天必上的网站 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 东莞办公家具厂家直销-美鑫【免费3D效果图】全国办公桌/会议桌定制 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 钛板_钛管_钛棒_钛盘管-无锡市盛钛科技有限公司 | 常州减速机_减速机厂家_常州市减速机厂有限公司 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | IP检测-检测您的IP质量 | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 家用净水器代理批发加盟_净水机招商代理_全屋净水器定制品牌_【劳伦斯官网】 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | led冷热冲击试验箱_LED高低温冲击试验箱_老化试验箱-爱佩百科 | 济南品牌包装设计公司_济南VI标志设计公司_山东锐尚文化传播 | 压滤机滤板_厢式_隔膜_板框压滤机滤板厂家价格型号材质-大凯环保 | 餐饮加盟网_特色餐饮加盟店_餐饮连锁店加盟 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | 美名宝起名网-在线宝宝、公司、起名平台 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 雨水收集系统厂家-雨水收集利用-模块雨水收集池-徐州博智环保科技有限公司 | 北京中创汇安科贸有限公司| 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 振动台-振动试验台-振动冲击台-广东剑乔试验设备有限公司 |