我在 views.py 中有一个DetailView:
views.py
class CustomView(DetailView):
context_object_name = 'content'
model = models.AppModel
template_name = 'dynamictemplate.html'
def get_context_data(self, **kwargs):
data = super(CustomView, self).get_context_data(**kwargs)
<...snipped...>
return data
当来自 urls.py 的请求转移到 views.py 时,如何更新模型字段IntegerField
。假设IntegerField的名称是点击,当用户访问特定链接或被动地访问数据库中的模型对象时,我该怎样才能增加该对象的点击字段由1.
答案 0 :(得分:2)
您可以使用self.object
并以这种方式更新:
self.object.clicks = self.object.clicks + 1
self.object.save()
但丹尼尔在评论中说,使用此代码可以面对race condition。所以最好像这样使用F expressions
:
from django.db.models import F
def get_context_data(self, **kwargs):
data = super(CustomView, self).get_context_data(**kwargs)
self.object.clicks = F('clicks') + 1
self.object.save()
<...snipped...>
return data
答案 1 :(得分:0)
neverwalkaloner非常接近,但是对象在保存后需要从数据库中刷新。
from django.db.models import F
def get_context_data(self, **kwargs):
context = super(CustomView, self).get_context_data(**kwargs)
self.object.clicks = F('clicks') + 1
self.object.save()
self.object.refresh_from_db()
<...snipped...>
return context
现在将显示点击的值,而不是F表达式的__repr__
。