Login
芋圆社区 > 编程 > Django > auto_now=True引发的问题

auto_now=True引发的问题

325
0
2022-03-21
2022-05-17
Hey、小怪兽

  • • 我的博客Model更新时间用的就是auto_now=True
  • updated = models.DateTimeField(auto_now=True, verbose_name='博客更新时间')
  • # 博客
    class blog(models.Model):
        list = models.ForeignKey(blogList, on_delete=models.CASCADE, verbose_name='博客系列标题')
        title = models.CharField(max_length=20, verbose_name='博客名')
        author = models.CharField(max_length=20, verbose_name='博客作者')
        summary = models.TextField(max_length=300, verbose_name='博客简介')
        content = RichTextUploadingField(verbose_name='博客内容')
        image = models.ImageField(upload_to='blogList/%Y%m%d/', blank=True, verbose_name='博客配图')
        created = models.DateTimeField(default=timezone.now, verbose_name='博客创建时间')
        updated = models.DateTimeField(auto_now=True, verbose_name='博客更新时间')
        index = models.PositiveIntegerField(default=0, verbose_name='博客排序')
        tag = models.PositiveIntegerField(default=0, verbose_name='博客标签')
    
        views = models.PositiveIntegerField(default=0, verbose_name='博客总浏览')
        likes = models.PositiveIntegerField(default=0, verbose_name='博客总赞数')
        comments = models.PositiveIntegerField(default=0, verbose_name='博客总评论')
    
        class Meta:
            verbose_name_plural = U'博客'
    
        def __str__(self):
            return U'blog:%s' % self.title
  • • auto_now=True这个参数的意思是,每次更新数据的时候都会自动将当前的时间写入
  • • 按理来说是没啥问题的,每次我更新博客文章的时候,这个updated字段才会更新,我的博客出现的BUG是:只要一进入这个博客的页面,这个字段就会更新
  • • 这里就要追溯到我之前介绍的博客浏览量增加的方法了:
  • • 我之前的博客浏览的方法,只要进入到博客详情的页面,那么这个博客的views字段,也就是浏览字段+1,之后用save保存
  • def blogdetail_view(request, id):
        blogDetail = blog.objects.get(id=id)
    
        # 更新浏览数
        blogDetail.views += 1
        blogDetail.save()
    
        return render(request, 'blog/blogDetail.html', locals())
  • • 分开来看这两个都没啥问题,但是合起来的话就错了
  • • 虽然我没有操作updated字段的数据,但是save这个方法它经过了Model层,它会自动更新带有auto_now=True参数的字段,这就导致了我每次进入博客详情,浏览量增加了,updated也更新了,这显然是不正常的,因为我并没有进行修改
  • • 问题找到了,是save的问题,这里就会想到另外一个保存的方法update,update和save的区别在于它直接调用sql语句,并不经过model层
  • • 可以将原来的代码修改,先将blogDetail.views+1,然后赋值给blogDetailViews变量,之后再用update更新
  • blogDetailViews = blogDetail.views + 1
    blog.objects.filter(id=id).update(views=blogDetailViews)
  • • 这样是可以的,但在我的return里写的是locals,它会将所有变量传给前端模板,我们在前端模板其实可以不需要blogDetaiViews这个变量,这样就浪费了
  • return render(request, 'blog/blogDetail.html', locals())
  • • 所以我们可以用F函数
  • • 首先导入F函数
  • from django.db.models import F
  • • 就可以一行代码搞定
  • blog.objects.filter(id=id).update(views=F('views')+1)
  • • 完整代码如下:
  • from django.db.models import F
    
    def blogdetail_view(request, id):
        blogDetail = blog.objects.get(id=id)
    
        # 更新浏览数
        # blogDetailViews = blogDetail.views + 1
        # blog.objects.filter(id=id).update(views=blogDetailViews)
        blog.objects.filter(id=id).update(views=F('views')+1)
    
        return render(request, 'blog/blogDetail.html', locals())
  • • 这样完成了吗?并没有,这样反而出现了一个新的BUG
  • • 让我们找一个博客看看,如图,减肥第一周的博客,它有37个访问量,那么我们进入这个博客详情后,它应该变成38吧
  • • 可是当我们进入这篇博客后,发现了,它还是37,它其实更新了,我们退出到博客列表就可以看到其实它已经是38了
  • • 这里我之前看到了一篇文章说明update和save的,但是忘了在哪看到的,文章里写save方法,它改变了值后,会重新返回一个值,也就是我们之前从数据库提取的blogDetail
  • blogDetail = blog.objects.get(id=id)
  • • 之前的这个方法save后,会重新返回blogDetai,也就会立马更新了数据,所以如果浏览变成了38后,也会将38传给前端模板
  • blogDetail.views += 1
    blogDetail.save()
  • • 然而update不会,它是运行了sql语句,这里就很明了了
  • • 第一种解决方法,如果是用第一种更新浏览数的话
  • blogDetailViews = blogDetail.views + 1
    blog.objects.filter(id=id).update(views=blogDetailViews)
  • - 可以直接将blogDetailViews给前端模板,将blogDetai.views修改成blogDetaiViews就可以了
  • <span>{{ blogDetail.views }}</span>
  • <span>{{ blogDetailViews }}</span>
  • • 第二种解决办法也是最简单的(用F函数更新浏览量),因为我们是先从数据库拿了blogDetail,再更新浏览量的,我们可以先更新浏览量,再拿blogDetail
  • from django.db.models import F
    
    def blogdetail_view(request, id):
        # 更新浏览数
        blog.objects.filter(id=id).update(views=F('views')+1)
    
        blogDetail = blog.objects.get(id=id)
    
        return render(request, 'blog/blogDetail.html', locals())
  • wink这样就完成啦!

上一篇:标签属性使用变量引发的BUG

下一篇:图片上传后大小问题

Comment

Message Board

编程导航

Django使用Less

美化后台管理Admin

FBV 和 CBV

SimpleUI后台导航栏报错

Django多条件查询

标签属性使用变量引发的BUG

auto_now=True引发的问题

图片上传后大小问题

Django版本查看和升级

values和values_list

过滤器linebreaksbr

拆分views文件

AutoField报错

order_by多条件和随机排序

Django变量名的坑

Copyright © 2020 芋圆社区

Powered by 浙ICP备2020039309号-1

此页面不支持夜间模式!

已进入夜间模式!

已进入普通模式!

搜索框不允许为空

签到成功!经验+5!芋圆币+2!

签到失败!今日已签到!

需要登录社区账号才可以进入!

复制成功
寄,页面未加载完成或页面无锚点