常用点赞和踩灭代码(事务处理)
一、事务处理
在处理http请求中,经常会遇到复杂的对数据库操作的业务逻辑,比如创建修改一系列相关的对象,但是一旦其中某处出现执行失败或异常,都要求回退前面已经执行成功的数据库操作。这时候数据库的事务管理就非常重要了。
Django 框架提供了很多的开启事务的方式,比较常用的是@transaction.atomic
简单的说事务处理做了以下操作:如果这些代码被成功的执行,所对应的改变也会提交到数据库中。如果有异常发生,那么操作就会回滚。
from django.db import transaction
response={"state":True,"first_updown":None}
try:
with transaction.atomic(): # 事务处理
obj=ArticleUpDown.objects.create(user_id=user_id,article_id=article_id,is_up=is_up)
if is_up:
Article.objects.filter(nid=article_id).update(up_count=F("up_count")+1)
else:
Article.objects.filter(nid=article_id).update(down_count=F("down_count")+1)
except Exception as e:
first_updown = ArticleUpDown.objects.filter(user_id=user_id, article_id=article_id).values("is_up").first().get("is_up")
response["state"]=False
response["first_updown"] = first_updown #标志第一次做了点赞还是踩灭
二、点赞、踩灭代码

1.html代码
<div class="up_down clearfix">
<div id="div_digg">
<div class="diggit digg">
<span class="diggnum" id="digg_count">{{ article_obj.up_count }}</span>
</div>
<div class="buryit digg">
<span class="burynum" id="bury_count">{{ article_obj.down_count }}</span>
</div>
</div>
<div class="diggword" id="digg_tips"></div>
</div>
<script>
$(".digg").click(function () {
var is_up = $(this).hasClass("diggit")
$.ajax({
url:"/app01/digg/",
type:"post",
data:{
article_id:{{ article_obj.nid }},
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
is_up:is_up
},
success:function (data) {
var error_info;
if(data.state){
if (is_up) {
var val = parseInt($("#digg_count").text()) + 1;
$("#digg_count").text(val);
}
else {
var val = parseInt($("#bury_count").text()) + 1;
$("#bury_count").text(val);
}
}
else{
if (data.first_updown) {
error_info = "已经点赞过了"
} else {
error_info = "已经踩灭过了"
}
$("#digg_tips").html(error_info).css('color','red');
setTimeout(function () {
$("#digg_tips").html("")
},1000);
}
},
})
});
</script>
2、views代码
from django.db.models import F
from django.db import transaction
from django.http import JsonResponse
def digg(request):
print(request.POST)
article_id=request.POST.get("article_id")
is_up = json.loads(request.POST.get("is_up"))
user_id=request.user.pk
response={"state":True,"first_updown":None}
try:
with transaction.atomic(): # 事务处理
obj=ArticleUpDown.objects.create(user_id=user_id,article_id=article_id,is_up=is_up)
if is_up:
Article.objects.filter(nid=article_id).update(up_count=F("up_count")+1)
else:
Article.objects.filter(nid=article_id).update(down_count=F("down_count")+1)
except Exception as e:
first_updown = ArticleUpDown.objects.filter(user_id=user_id, article_id=article_id).values("is_up").first().get("is_up")
response["state"]=False
response["first_updown"] = first_updown #标志第一次做了点赞还是踩灭
return JsonResponse(response)
主要注意代码中的事务处理和html中的层层判断。

浙公网安备 33010602011771号