【问题标题】:Django Incrementing Model Instance Attribute in Views w/ F()+1 and Accessing from TemplateDjango 在带有 F()+1 的视图中增加模型实例属性并从模板访问
【发布时间】:2016-01-22 18:55:13
【问题描述】:

所以我有一个模型Listing(),它有一个字段views。在我的一个观点中,当有人查看列表页面时,views 字段通过listing.views = F('views') + 1listing.save(update_fields=['views']) 加一。我的问题是,当我使用{{ listing.views }} 从同一个模板访问views 属性时,模板不显示当前的视图数量,而是显示F(views) + Value(1)(字面意思是该文本)。现在,我假设我可以使用模型方法,例如 def get_views(),它会返回 self.views,但我想知道为什么我会遇到这个奇怪的问题。另外,有没有一种不用写模型方法就能得到​​实际整数而不是奇数F(views) + Value(1)的方法?

这是我当前的代码:

models.py

class Listing(models.Model):
    ...
    views = models.IntegerField(default=0)

listings.py

class ListingView(View):

def get(self, request):
    listing_id = request.GET['listing_id']
    listing = get_object_or_404(Listing, id=listing_id)

    listing.views = F('views') + 1
    listing.save(update_fields=['views'])

    return render(request, 'listings.html', {'listing': listing})

listings.html

<html>
    {{ listing.views }}
</html>

【问题讨论】:

  • 不确定F objects 的使用是否合适;有什么理由不使用listing.views += 1
  • 显然从我所读的内容来看它更有效 - 但老实说我不是 100% 确定(尽管代码确实有效)。如果没有人可以提供可行的替代方案,我将默认返回您建议的代码。
  • 你说得对!嗯。我一直使用它们进行查询内计算。无论如何,有一些文档可以帮助您回答下面的问题。

标签: python django postgresql model-view-controller orm


【解决方案1】:

使用这样的 F 表达式需要您在保存后重新获取项目以获取更新的值(由于 F 表达式在数据库级别更新而不是模型实例本身的性质;也许这就是减少的地方运营成本)。

来自docs -

为了访问以这种方式保存的新值,需要重新加载对象:

reporter = Reporters.objects.get(pk=reporter.pk)
# Or, more succinctly:
reporter.refresh_from_db()

【讨论】:

  • 谢谢!不过有一个问题 - 因为这是从数据库中重新获取的,所以像你建议的那样使用 listing.views += 1 会更好吗?
  • 无论哪种方式,您都会处理 2 个 DB 命中,所以我认为它们的成本基本相同。我很想听听其他人对此的看法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
相关资源
最近更新 更多