遇到DetailView时更新模型字段。 [Django的]

时间:2018-04-30 08:17:04

标签: python django url

我在 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.

2 个答案:

答案 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__