【问题标题】:save with many-to-many relationship in django problem [duplicate]在django问题中保存多对多关系[重复]
【发布时间】:2011-01-21 13:35:11
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

    标签: django django-models


    【解决方案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。如果在这种情况下读取比写入更频繁,并且您想要优化性能,请考虑缓存并标记数据已更改。

    【讨论】:

      【解决方案2】:

      我希望在第一次调用 Author.save 时,self.proposal.all() 将是一个空集。 (惊讶它实际上并没有出错)。由于 Author 实例本身尚未保存,因此它没有主键,因此我们不希望能够找到与尚不存在的事物相关联的任何内容(从数据库的角度来看) .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-02
        • 2015-07-09
        • 2017-12-16
        • 2018-07-05
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多