Python 视图中的Django递增模型实例属性w/F()+;1和从模板访问

Python 视图中的Django递增模型实例属性w/F()+;1和从模板访问,python,django,postgresql,model-view-controller,orm,Python,Django,Postgresql,Model View Controller,Orm,因此,我有一个模型Listing(),它有一个字段views。在我的一个视图中,当有人查看列表页面时,views字段通过listing.views=F('views')+1和listing.save(update_fields=['views'])递增一。我的问题是,当我使用{{listing.views}}从同一模板访问视图属性时,模板显示的不是当前的视图数量,而是F(视图)+Value(1)(字面上就是该文本)。现在,我假设我可以使用一个模型方法,比如def get_views(),它将返回

因此,我有一个模型
Listing()
,它有一个字段
views
。在我的一个视图中,当有人查看列表页面时,
views
字段通过
listing.views=F('views')+1
listing.save(update_fields=['views'])
递增一。我的问题是,当我使用
{{listing.views}}
从同一模板访问
视图
属性时,模板显示的不是当前的视图数量,而是
F(视图)+Value(1)
(字面上就是该文本)。现在,我假设我可以使用一个模型方法,比如
def get_views()
,它将返回
self.views
,但我想知道为什么会出现这个奇怪的问题。还有,有没有一种方法不需要编写模型方法,就可以得到实际的整数,而不是奇数
F(视图)+值(1)

这是我目前的代码:

型号.py

class Listing(models.Model):
    ...
    views = models.IntegerField(default=0)
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.py

class Listing(models.Model):
    ...
    views = models.IntegerField(default=0)
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>

{{listing.views}

使用这样的F表达式需要您在保存后重新获取项,以获得更新的值(由于F表达式在数据库级别更新的性质,而不是模型实例本身;这可能是降低操作成本的原因)

从—

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


使用这样的F表达式需要在保存后重新获取项以获得更新的值(由于F表达式在数据库级别更新的性质,而不是模型实例本身;这可能是降低操作成本的原因)

从—

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


不确定这是否适合使用
F对象
;你为什么不使用
listing.views+=1
?从我所读到的内容来看,它显然更有效-但老实说,我不是100%确定(尽管代码确实有效)。如果没有人能提供一个可行的替代方案,我会默认回到你建议的代码。你完全正确!呵呵。我总是在查询计算中使用它们。无论如何,下面的一些文档可能会帮助您回答这个问题。不确定这是否适合使用
F objects
;你为什么不使用
listing.views+=1
?从我所读到的内容来看,它显然更有效-但老实说,我不是100%确定(尽管代码确实有效)。如果没有人能提供一个可行的替代方案,我会默认回到你建议的代码。你完全正确!呵呵。我总是在查询计算中使用它们。不管怎样,下面有一些文档可以帮助你回答这个问题。谢谢!不过有一个问题-既然这是从db中重新提取的,那么像您建议的那样使用
listing.views+=1
是否是更好的优化?无论哪种方式,您都会处理w/2 db点击,因此我认为它们的成本基本相同。我很想听听其他人对此的想法。谢谢!不过有一个问题-既然这是从db中重新提取的,那么像您建议的那样使用
listing.views+=1
是否是更好的优化?无论哪种方式,您都会处理w/2 db点击,因此我认为它们的成本基本相同。我很想听听其他人对此的想法。