从 Django 中的 .py 文件修改数据库对象字段
Modify db object field from .py file in django
我有一个对应于 models.py 中可用的模型 A 的表单,其中有一个 "amount" 字段。
我还有一个模型 B,它也有一个 "total_amount" 字段。
通过相应的表单创建新的模型 A 时,提交表单后我想保存模型 A 并修改模型 B 的 total_amount 字段,因此它是:ModelB.total_amount += ModelA.amount。
我通过这行代码表示了这个逻辑:
def form_valid(self, form):
self.object = form.save(commit=False)
amount_to_add = form.cleaned_data['amount']
model_b = utils.get_model_b_by_currency(form.cleaned_data['currency'])
model_b[0].total_amount = model_b[0].total_amount + amount_to_add
model_b[0].save()
self.object.save()
return super(ModelFormMixin, self).form_valid(form)
代码正确执行,模型 A 已创建,但模型 B "total_amount" 字段未更新为新值。
任何想法都会很有帮助。
在 'modelA' class 中创建以下函数:
def save(self, *args, **kwargs):
amount_to_add = self.amount # The amount field in model A class
model_b = utils.get_model_b_by_currency(self.amount)
model_b[0].total_amount = model_b[0].total_amount + amount_to_add
model_b[0].save()
return super(ModelA, self).save(*args, **kwargs)
您的get_model_b_by_currency
正在return查询集而不是单个实例。每次对查询集进行切片时,都会得到一个新实例。相反,return 来自 get_model_b_by_currency
的实例 - 例如通过使用 get()
而不是 filter()
- 或者将其切片一次,将其分配给一个变量,然后修改并保存它变量。
我有一个对应于 models.py 中可用的模型 A 的表单,其中有一个 "amount" 字段。 我还有一个模型 B,它也有一个 "total_amount" 字段。 通过相应的表单创建新的模型 A 时,提交表单后我想保存模型 A 并修改模型 B 的 total_amount 字段,因此它是:ModelB.total_amount += ModelA.amount。 我通过这行代码表示了这个逻辑:
def form_valid(self, form):
self.object = form.save(commit=False)
amount_to_add = form.cleaned_data['amount']
model_b = utils.get_model_b_by_currency(form.cleaned_data['currency'])
model_b[0].total_amount = model_b[0].total_amount + amount_to_add
model_b[0].save()
self.object.save()
return super(ModelFormMixin, self).form_valid(form)
代码正确执行,模型 A 已创建,但模型 B "total_amount" 字段未更新为新值。
任何想法都会很有帮助。
在 'modelA' class 中创建以下函数:
def save(self, *args, **kwargs):
amount_to_add = self.amount # The amount field in model A class
model_b = utils.get_model_b_by_currency(self.amount)
model_b[0].total_amount = model_b[0].total_amount + amount_to_add
model_b[0].save()
return super(ModelA, self).save(*args, **kwargs)
您的get_model_b_by_currency
正在return查询集而不是单个实例。每次对查询集进行切片时,都会得到一个新实例。相反,return 来自 get_model_b_by_currency
的实例 - 例如通过使用 get()
而不是 filter()
- 或者将其切片一次,将其分配给一个变量,然后修改并保存它变量。