仅标题似乎是模糊的。 这是细节。

我有以下模型:

class Post(models.Model):     title = models.CharField(max_length=100)     # deleted for brevity     created_at = models.DateTimeField(blank=True, null=True, auto_now_add=True)     updated_at = models.DateTimeField(auto_now=True)     count_visits = models.PositiveIntegerField(default=1)  # counts visit time of posts 

并在blogs.html添加了以下代码:

{% if post.created_at == post.updated_at %}      Posted {{ post.created_at|naturaltime }}  {% else %}      Updated {{ post.updated_at|naturaltime }}  {% endif %} 

然后我在DetailView做了一个简单的if statement来跟踪某个帖子的访问者数量:

def post_detail(request, title_slug):     obj = get_object_or_404(Post, slug=title_slug)     session_key = f'key_{title_slug}'      if not request.session.get(session_key, False):         obj.count_visits += 1         obj.save()         request.session[session_key] = True      return render(request, 'blogApp/detail.html', {'post': obj}) 

这是问题所在,当我创建帖子时,在列表视图中显示“立即Posted now

在此处输入图片说明

但是当我单击该帖子以查看其详细信息时。 它显示立即Updated now

在此处输入图片说明

当我进入详细视图时,我想我知道出了什么问题。 它创建一个session_key ,使obj.count_visits += 1递增并保存对象obj.save()

调用obj.save() ,它将更新数据库,其中包括updated_at字段,这就是为什么我Updated nowUpdated now

我该如何解决? 我想增加count_views字段的数量,但是保存对象时不应更改updated_at字段。

我希望你能帮助我。 谢谢

===============>>#1 票数:1 已采纳

您可以绕过Django层直接在数据库上进行更新:

from django.db.models import F  if not request.session.get(session_key, False):     type(obj).objects.filter(pk=obj.pk).update(         count_visits=F('count_visits') + 1 ) 

这将导致以下数据库查询:

UPDATE "<db_table>" SET "count_visits" = ("<db_table>"."count_visits" + 1) \     WHERE "<db_table>"."id" = <obj.id> 

F对象用于解析对现有数据库对象的引用,在这种情况下,我们获取字段count_visits的当前值。 这样做的重要特性是,它可以产生通过实现例如从操作和操作数(对象)表达__add____sub____mul____div__等dunder方法(实际上是由它的父类实现Combinable )。


另一种方法是采用附加的关键字参数来save ,该参数指示是否也应更新updated_at字段。 为此,首先我们还需要从字段实例中删除auto_now参数:

from django.utils import timezone  class Post(models.Model):         ...     updated_at = models.DateTimeField(default=timezone.now)     ...      def save(self, *args, set_updated_at=True, **kwargs):         if self.pk is not None:             if set_updated_at:                 self.updated_at = timezone.now()          super().save(*args, **kwargs) 

现在,您只需要在调用save时传递参数,例如,在这种情况下,它应该为False

if not request.session.get(session_key, False):     obj.count_visits += 1     obj.save(set_updated_at=False) 

  ask by Basir Payenda translate from so

本文未有回复,本站智能推荐: