我在django中有以下问题..我有models.py
class Proposal(models.Model):
#whatever....
credit =models.FloatField(null=True, blank=True)
def save():
#here credit is saved based on some calculation (succesfully)
class Author(models.Model):
#whatever....
balance = models.FloatField(null=True,blank=True)
proposal = models.ManyToManyField(Proposal,null=True,blank=True)
def save(self, force_insert=False, force_update=True):
to_add = sum(self.proposal.all().values_list('credit',flat=True)) # a sum of credits
self.balance = self.balance + to_add # or F(self.balance) + to_add, anyway
try:
super(Author, self).save(force_insert, force_update)
except IntegrityError:
super(Author, self).save(force_insert=True, force_update=False)
所以我从管理员创建了一个作者,并在作者内部创建了一个提案,我“保存”提案对象,确定,成功保存了信用,然后我保存了作者,但没有更新余额。如果只重新保存作者对象,就会发生这种情况。
有什么建议吗?
答案 0 :(得分:1)
让我说,我不确定你的问题是什么,但我不认为尝试这样做是个好主意。通常情况下,在计算一个数据集中的一个数据来执行 lookup 而不是 save 的情况下,并且有充分的理由。即使上述方法按预期工作,您仍然需要在Author
本身未直接更改时必须保存Author
对象。做更好的事情,比如:
class Author(models.Model):
proposal = models.ManyToManyField(Proposal,null=True,blank=True)
def get_balance(self):
return sum(self.proposal.all().values_list('credit',flat=True))
如果您确实需要编写author.balance
而不是author.get_balance
,请考虑python properties。如果这种情况下读取比写入更频繁并且您希望优化性能,请考虑缓存并标记数据已更改。
答案 1 :(得分:0)
我希望在第一次调用Author.save时,self.proposal.all()将是一个空集。 (惊讶的是它实际上并没有错误)。由于Author实例本身尚未保存,因此它不会有主键,因此我们不希望能够找到任何与尚不存在的内容相关的内容(从数据库的角度来看) 。