django - 保存另一个表单时如何更新另一个模型字段
问题描述
嗨,我有 2 个模型Game
和Match
模型.py
class Game(models.Model):
title = models.CharField(max_length=255)
team1score = models.IntegerField(null=True, blank=True,default=0)
...
team2score = models.IntegerField(null=True, blank=True,default=0)
...
class Match(models.Model):
title = models.CharField(max_length=255)
game=models.ForeignKey(Game,on_delete=models.CASCADE)
team1score = models.IntegerField(null=True, blank=True,default=0)
...
team2score = models.IntegerField(null=True, blank=True,default=0)
...
表格.py
class MatchForm(forms.ModelForm):
team1score = forms.IntegerField(widget=forms.TextInput,required=False)
team2score = forms.IntegerField(widget=forms.TextInput,required=False)
class Meta:
model=Match
fields=['team1score',
'team2score',
...
]
我正在使用下面的代码创建一个匹配对象。
视图.py
def creatematch(request,...):
form = MatchForm(request.POST or None)
if form.is_valid():
match = form.save(commit=False)
...
match.save()
...
现在,我的问题是如何更新game.team1score
以及game.team2score
何时创建match
对象
解决方案
使用模型的ForeignKey
关系Match
来获取Game
您想要的实例:
def creatematch(request,...):
form = MatchForm(request.POST or None)
if form.is_valid():
match = form.save(commit=False)[0]
game = match.game
game.team1score += match.team1score
game.team2score += match.team2score
game.save()
match.save()
但这是一个次优的解决方案,因为您实际上运行 a SELECT * FROM GAME
,等待结果,然后在向数据库发送第二个查询之前执行所有计算。
相反,您应该使用F()
,它在您的数据库中进行此计算:
from django.db.models import F
def creatematch(request,...):
form = MatchForm(request.POST or None)
if form.is_valid():
match = form.save(commit=False)[0]
game = match.game
game.team1score = F('team1score') + match.team1score
game.team2score = F('team2score') + match.team2score
game.save()
match.save()
推荐阅读
- spring - 带有 RESTAPI 令牌的 Spring Boot 基本身份验证
- nuxt.js - Nuxt.js 生成带有动态 URL 的页面
- java - 如何使用 Cucumber 和范围报告设置步骤状态?
- regex - 正则表达式查找和修复 LF lineEndings 到 CRLF
- react-native - 如何在 Detox 中调整视图的可见性阈值
- python - 单击“播放”时如何清除我的游戏屏幕并移动到新场景
- windows - 在 Windows 上根据给定优先级获取互斥锁
- regex - 使用气体的 Google RE2 正则表达式
- android - 带有 Switch Cases 的 Android ViewModel 不起作用?
- apache-flink - 停止作业而不是重试 Apache Flink 中的特定异常