Django数据库操作之save与update的使⽤
Python框架Django有着诸多优点,它提供的models可以让开发者⽅便地操作数据库,但正是由于对上层的良好的封装,使得提升数据库操作性能必须要清楚地知道Django的数据库操作到底执⾏了哪些SQL语句。
例如数据更新操作,对单条记录,可以使⽤save或者是update两种⽅式
在Django⼯程下的settings.py下将log设置为DEBUG,即可查看save和update分别执⾏了哪些SQL语句
如有⼀张表名叫做Example
使⽤save:
k = (id=481)
k.save()
执⾏的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` = , `phon
e` = , `email` = , `company_name` = , `address` = , `if_type` = 0, `code` = , `l
ocation` = , `total_days` = 0, `total_length` = 0, `total_calories` = 12, `comme
nts` = , `reserved_1` = , `reserved_2` = , `reserved_3` = , `reserved_4` = , `re
served_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 1
7:43:53', 481)
⾸先要查询k这条记录,然后save()的时候提交更新的内容,发现更新的时候把Example中的有字段都SET赋值的⼀次
使⽤update
Example.objects.filter(id=481).update(total_calories = 10)
执⾏的SQL语句是:
UPDATE `Example` SET `total_calories` = 1
0 WHERE (`Example`.`user_id` = asdfasdf
AND `Example`.`id` = 481 ); args=(10, u'asdfasdf', 481)
这条SQL语句简短⽽且执⾏速度要优于使⽤save的速度。
从SQL的执⾏情况来看,使⽤upate是要优于save⽅式的。
从使⽤情境上看,update更加适⽤于批量数据更新,⽽save则更适合当然也只适合做单条记录的数据更新操作了。
在使⽤Django的数据模型操作数据库时,了解这些底层的SQL操作很有必要。
补充知识:如何理解Django的save(commit=False)⽅法和save_m2m()⽅法批量更新sql语句
什么时候使⽤save(commit=False)⽅法,save_m2m⽅法以及如何使⽤是Django表单forms进阶必需了解的知识。我们今天就带你来看⼀看。
何时使⽤save(commit=False)⽅法
Stackoverflow上其实已经有了⼀段⾮常精炼的答案。英⽂原⽂如下,我把它翻译了⼀下:
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.
当你通过表单获取你的模型数据,但是需要给模型⾥null=False字段添加⼀些⾮表单的数据,该⽅法会⾮常有⽤。如果你指定commit=False,那么save⽅法不会理解将表单数据存储到数据库,⽽是给你返回⼀个当前对象。这时你可以添加表单以外的额外数据,再⼀起存储。
save(commit=False)⽅法实际应⽤案例
下⾯我们来看⼀个实际应⽤案例。我们创建了⼀个叫⽂章Article的模型,⾥⾯包含title, body和作者author等多个字段,其中author字段⾮空null=False。我们由Article模型创建了⼀个ArticleForm表单,可以让⽤户发表新⽂章,但是我们故意把author 字段除外了,因为我们不希望⽤户编辑作者。
最后⽤户提交的表单数据⾥肯定没有author,当这样的数据提交到数据库时肯定会有问题的。所以我们先通过 article = form.save(commit=False)创建article实例,此时让Django先不要发送数据到数据库,等待我们把author添加好后,再把数据⼀起存储到数据库中。
下⾯是视图⽂件views.py的代码。最重要的是ArticleForm构成和article_create⽅法。
from .models import Article
from django.forms import ModelForm
from django.http import HttpResponseRedirect
from django.shortcuts import render
class ArticleForm(ModelForm):
class Meta:
model = Article
exclude = ['author']
def article_create(request):
hod == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save(commit=False)
# commit=False告诉Django先不提交到数据库.
article.author = request.user # 添加额外数据
article.save() # 发送到数据库
return HttpResponseRedirect("/blog/")
else:
form = ArticleForm()
return render(request, 'blog/article_create_form.html', {'form': form})
如果你使⽤Django⾃带的基于类的视图(CBV), 你可以使⽤form_valid⽅法完成上述同样的操作。具体代码如下。
from ic.edit import CreateView
from .models import Article
from 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 quest.user
def form_valid(self, form):
form.instance.author = quest.user
return super().form_valid(form)
何时使⽤save_m2m⽅法及如何使⽤
save_m2m⽅法只⽤来存储多对多的关系。当你同时满⾜下⾯两个条件时,你需要使⽤此⽅法。如果你直接使⽤save()或form_valid()⽅法,是可以直接存储多对多(m2m)关系的,不需要⽤save_m2m。
你使⽤了save(commit=False)⽅法
你的model⾥有多对多的关系(⽐如tags)
假设我们⽂章模型⾥有tags这个多对多的字段,我们的article_create⽅法需要增加⼀⾏。
def article_create(request):
hod == '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数据库操作之save与update的使⽤就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。