常用点赞和踩灭代码(事务处理)

一、事务处理

  在处理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中的层层判断。

posted @ 2019-07-14 10:51  HelloBaby!  阅读(280)  评论(0)    收藏  举报