从 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() - 或者将其切片一次,将其分配给一个变量,然后修改并保存它变量。