在django问题中保存多对多关系

时间:2010-02-26 17:48:14

标签: django django-models

我在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)

所以我从管理员创建了一个作者,并在作者内部创建了一个提案,我“保存”提案对象,确定,成功保存了信用,然后我保存了作者,但没有更新余额。如果只重新保存作者对象,就会发生这种情况。

有什么建议吗?

2 个答案:

答案 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实例本身尚未保存,因此它不会有主键,因此我们不希望能够找到任何与尚不存在的内容相关的内容(从数据库的角度来看) 。