首页 > 解决方案 > 如何增加我的外键模型上的计数器

问题描述

我有以下疑问:假设我的 Django 项目有以下模型:

class State(models.Model):
    initials = models.CharField('Initials', max_length=2, blank = False)
    name     = models.CharField('State', max_length=50, blank = False)
    count    = models.IntegerField('Foo Counter', default=0)
    ....


class Foo(models.Model):
   name  = models.CharField('Name', max_length=50, blank = False)
   state = models.ForeignKey(State, verbose_name='State', related_name='state_fk', on_delete=models.DO_NOTHING),
   .... 

所以我有一个表格可以将 Foo 实例添加到我的数据库中:

class FooForm(forms.ModelForm):
   class Meta:
       model  = Foo
       fields = '__all__' 

这是 view.py 文件:

def home(request):
    template_name = 'home.html'
    form = FooForm(request.POST or None)
    if form.is_valid():
        salvar = form.save(commit=False)
        salvar.save()
        return redirect('FooApp:home')
    else:
        context = {
            'form': form
        }
        return render(request, template_name, context)

我需要这样,每次用户注册一个新的“Foo”时,他选择的“状态”的计数器都会增加 1,我在这里和 Django 的文档中搜索了很多,但我找不到这样做的方法。

标签: django

解决方案


如果它依赖于数据库计算,为什么需要count定义为模型字段,而不是从外部输入的东西?

如前所述,您可以在应用程序中添加逻辑以将count值更新Stateself.foo_set.count()

但是,我认为可能值得研究一种不同的方法,该方法将定义 a cached_propertyonState如下:

@cached_property
def count(self):
    return self.foo_set.count()

通过这种方式,您将能够访问State.count应用程序中所需的任何位置并获得正确的值,而不必担心保持更新。


推荐阅读