Django 使用ModelFormset保存的模型的保存覆盖中未更新相关模型
所以我有一个交易模型,是FK-d到a股。在“帐户”视图中,我有这些事务的模型表单集,我可以通过循环表单并保存它们来保存多个事务 在我事务的save()方法中,我尝试更新链接共享上的余额。如果我保存一个事务,这是可行的,但是当我发布包含多个事务的模型表单集时,每次我点击事务保存()覆盖中的self.share.balance=self.share.balance+amt行(即对于每个新事务),share.balance就是保存表单集中以前的任何事务之前的状态 是否有人知道为什么以前保存的交易中添加到共享余额的金额不会在后续保存中进行(为什么只有最后一笔交易的金额才会添加到共享余额) 应更新父模型共享余额的交易模型 共享模式Django 使用ModelFormset保存的模型的保存覆盖中未更新相关模型,django,django-models,django-forms,Django,Django Models,Django Forms,所以我有一个交易模型,是FK-d到a股。在“帐户”视图中,我有这些事务的模型表单集,我可以通过循环表单并保存它们来保存多个事务 在我事务的save()方法中,我尝试更新链接共享上的余额。如果我保存一个事务,这是可行的,但是当我发布包含多个事务的模型表单集时,每次我点击事务保存()覆盖中的self.share.balance=self.share.balance+amt行(即对于每个新事务),share.balance就是保存表单集中以前的任何事务之前的状态 是否有人知道为什么以前保存的交易中添加
class Share(models.Model):
name = models.CharField(max_length=80)
account = models.ForeignKey(Account, on_delete=models.CASCADE)
definition = models.ForeignKey(ShareDef, on_delete=models.PROTECT)
balance = models.DecimalField('Balance', max_digits=11, decimal_places=2, default=0)
def __str__(self):
return '%s %s %s %s'%(self.account,
self.name,
self.definition.sym_code,
self.balance )
def save(self, *args, **kwargs):
if not self.pk:
if not self.name:
self.name = self.definition.name
super(Share, self).save(*args, **kwargs)
鉴于此,我有一个事务表单集
#...in view
TranFormSet = modelformset_factory(Transaction, exclude=('origin','ach_entry'), extra=1)
if request.method=='POST':
...
tran_formset = TranFormSet(request.POST)
...
if tran_formset.is_valid():
for form in tran_formset:
tran = form.save(commit=False)
tran.account = account
tran.origin = 'tt'
tran.save()
else:
#...following kind of weird because of how I'm setting querysets of ModelChoiceFields
kwargs = {'account_instance': account}
tran_formset = TranFormSet(queryset=Transaction.objects.none())
tran_formset.form = (curry(TranForm, **kwargs))
表格
class TranForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
account_instance = kwargs.pop('account_instance', None)
super(TranForm, self).__init__(*args, **kwargs)
if account_instance:
self.fields['share'].queryset = account_instance.share_set.all()
if self.instance.pk:
del self.fields['share']
class Meta:
model=Transaction
exclude=['origin', 'ach_entry', 'account']
post_dt = forms.DateTimeField(initial=datetime.date.today(), widget=forms.TextInput(attrs=
{
'class': 'datepicker'
}))
share = forms.ModelChoiceField(empty_label='---------', required=False, queryset=Share.objects.all())
目前尚不清楚问题的原因,但在单个
update()
查询中执行self.share.balance
的更新可能会有所帮助。这可以通过以下方式实现:
从django.db.models导入F
类事务(models.Model):
# ...
def更新共享余额(自身):
如果self.db_cr==“cr”:
金额=自付金额
其他:
金额=-self.amt
#通过使用queryset update()方法,我们可以执行
#在单个查询中进行更改,而不使用可能旧的
#来自“self.share.balance”的值`
返回Share.objects.filter(id=self.Share\u id).更新(
余额=F(“余额”)+金额
)
def保存(自身、*args、**kwargs):
如果不是self.pk:
# ...
如果self.share:
# ...
self.update_share_balance()
#另外,请确保在最后调用super().save()方法!
super().save(*args,**kwargs)
事务保存是否可能并行运行?它们在查看您的代码时看起来是连续的,但您的问题听起来像是一个竞争条件,我不知道如何检查-我在调试中设置了断点并运行,甚至运行得很慢,这个问题发生了
class TranForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
account_instance = kwargs.pop('account_instance', None)
super(TranForm, self).__init__(*args, **kwargs)
if account_instance:
self.fields['share'].queryset = account_instance.share_set.all()
if self.instance.pk:
del self.fields['share']
class Meta:
model=Transaction
exclude=['origin', 'ach_entry', 'account']
post_dt = forms.DateTimeField(initial=datetime.date.today(), widget=forms.TextInput(attrs=
{
'class': 'datepicker'
}))
share = forms.ModelChoiceField(empty_label='---------', required=False, queryset=Share.objects.all())