django - 如何增加我的外键模型上的计数器
问题描述
我有以下疑问:假设我的 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 的文档中搜索了很多,但我找不到这样做的方法。
解决方案
如果它依赖于数据库计算,为什么需要count
定义为模型字段,而不是从外部输入的东西?
如前所述,您可以在应用程序中添加逻辑以将count
值更新State
为self.foo_set.count()
但是,我认为可能值得研究一种不同的方法,该方法将定义 a cached_property
onState
如下:
@cached_property
def count(self):
return self.foo_set.count()
通过这种方式,您将能够访问State.count
应用程序中所需的任何位置并获得正确的值,而不必担心保持更新。
推荐阅读
- json - 构建下拉列表并从 URL 动态获取 JSON 数据的最佳方法是什么
- html - 内容覆盖的下拉菜单
- owl-api - 如何使用 OWLReasoner 更新本体
- javascript - 减少方法 - 无法获得两个单独的结果
- java - 带有 TestCase JUnit 的 GradleException
- web-services - docker swarm - Leader(Manager) 节点服务端点和负载均衡
- excel - 使用 vlookup 到另一个带有多个 if 语句的工作表
- css - 仅使用内联 CSS 隐藏/显示 CSS
- spring - 如何在 Spring 集成中使用 ActiveMQ 队列
- python - Pyinstaller 编译的可执行文件失败,退出代码为 139