当前位置: 首页 > 面试题库 >

Django:将博客条目视图增加1。这样有效吗?

洪伟彦
2023-03-14
问题内容

我的索引视图中有以下代码。

latest_entry_list = Entry.objects.filter(is_published=True).order_by('-date_published')[:10]
for entry in latest_entry_list:
    entry.views = entry.views + 1
    entry.save()

如果从初始查询返回十行(限制),保存将发出10个单独的更新的数据库调用,还是Django的“智能”足以发出一个更新调用?

有没有更有效的方法来达到这个结果?


问题答案:

你可以F()为此使用对象。

这是你的导入方式F:from django.db.models import F

Django 1.1的新功能
调用更新也可以使用F()对象根据模型中另一个字段的值来更新一个字段。这对于基于计数器的当前值递增计数器特别有用。

Entry.objects.filter(is_published=True).update(views=F('views')+1)

尽管你无法对切片查询集进行更新… 编辑:实际上你可以…

这可以完全在Django ORM中完成。你需要两个SQL查询:

  1. 进行过滤并收集主键列表
  2. 对与任何主键匹配的项的非切片查询集进行更新。
    获取未切片的查询集是很困难的。我想知道使用,in_bulk但返回的是字典,而不是查询集。人们通常会使用它Q objects来执行复杂的OR类型查询,但这种方法可以工作,但pk__in工作却简单得多。
latest_entry_ids = Entry.objects.filter(is_published=True)\
                                      .order_by('-date_published')
                                      .values_list('id', flat=True)[:10]  
non_sliced_query_set = Entry.objects.filter(pk__in=latest_entry_ids)  
n = non_sliced_query_set.update(views=F('views')+1)  
print n or 0, 'items updated'

由于django懒惰地执行查询的方式,无论更新多少项目,这只会导致2次数据库命中。



 类似资料:
  • 问题内容: 我有一个现有的日期对象,希望将其增加一天,同时将其他所有字段保持不变。我遇到的每个示例都耗时数小时/分钟/秒,或者您必须创建一个新的日期对象并转移字段。有没有一种方法可以将日字段提前1? 谢谢 编辑:对不起,我并不是说要把当天的值增加一,我的意思是将日期提前1 问题答案: Calendar c = Calendar.getInstance(); c.setTime(yourdate);

  • 我一直在改变指纹的方式 我成功地更改了打印 所以我的问题是:在哪里编辑打印 检查了in/components/com_content/views/category/tmpl中的博客文件。但是找不到指纹 我是如何改变它的,例如,文章视图.../模板/my模板/html/com_content/文章/default.php 我换了指纹 为此: 我对特写视图也做了同样的操作。但我找不到打印的位置 到目前

  • 问题内容: 长期缺席并喜欢它之后,我目前正在重新使用Python。但是,我发现自己反复遇到一种模式。我一直认为,必须有一种更好的方式表达我想要的东西,而我可能做错了方式。 我正在编写的代码具有以下形式: 我在程序中写很多。我的第一个反应是将其推出辅助函数,但是通常python库已经提供了类似的功能。 我缺少一些简单的语法技巧吗?还是采用这种方式? 问题答案: 使用: 在Python> = 2.7中

  • 添加博客 初始设置 要设置您的网站的博客,先在您的仓库的网站目录中创建一个 blog 文件夹。 然后,在 siteConfig.js 中添加一个 header link 到你的博客: headerLinks: [ ... {blog: true, label: 'Blog'}, ... ] 添加博文 要在博客中发布,请在博客文件夹中创建一个格式为 YYYY-MM-DD-M

  • 我正在使用Laravel出纳和Stripe开发一个web应用程序订阅。 我正在使用stripev3javascriptapi,并使用card元素生成stripetoken。正在生成条带标记,如果您查看条带仪表板,将创建一个客户。此外,正在用户数据库中保存条带id。但是,当我尝试使用以下代码向用户订阅计划时: 它失败了,错误是:“没有这样的客户:cus_xxxxxx”。$PlanId变量是Strip

  • 问题内容: 我遵循的是官方Django文档中的第一个应用程序教程,尝试保存通过管理页面进行的某些更改时出现此错误。我对此进行了一些研究,但是我能够找到的可能解决方案(例如迁移数据库)根本行不通。如果您想查看我的代码的某些特定部分,请告诉我。 以下是错误: and the traceback: 问题答案: 我自己碰到了这个问题,它似乎与https://code.djangoproject.com/t