2

この質問が何度も投稿されていることは知っていますが、この問題に対する明確な答えはまだ見つかりませんでした。だから、ここに行きます:

class Invoice(models.Model):
    program = models.ForeignKey(Program)
    customer = models.ForeignKey(Customer, related_name='invoices')
    participants = models.ManyToManyField(Participant, related_name='participants_set')
    subtotal = models.DecimalField(max_digits=10, decimal_places=2, default='0.00', blank=True, null=False)
    pst = models.DecimalField("PST", max_digits=10, decimal_places=2, default='0.00', blank=True, null=False)
    gst = models.DecimalField("GST", max_digits=10, decimal_places=2, default='0.00', blank=True, null=False)
    total = models.DecimalField(max_digits=10, decimal_places=2, default='0.00', blank=True, null=False)

    def save(self, **kwargs):
        super(Invoice, self).save(**kwargs)
        items = self.participants.count()
        subtotal = Decimal(self.program.fee) * items
        pst = self.program.is_pst and Decimal(PST)*subtotal or Decimal('0.00')
        gst = self.program.is_gst and Decimal(GST)*subtotal or Decimal('0.00')
        total = (subtotal + pst) + gst
        self.subtotal = subtotal
        self.pst = pst
        self.gst = gst
        self.total = total
        super(Invoice, self).save(**kwargs)

self.participants.count() が機能しないことを除いて、すべて正常に機能します。何が問題なのか考えてみてください。どんな助けでも大歓迎です。

4

4 に答える 4

5
self.participants.all().count()
于 2009-12-08T05:39:43.250 に答える
0

保存中に参加者数を試しているため、クエリがすべてを見つけられない可能性があるためだと思います。データベースの作成時にこの数に依存している場合Invoice、ID がまだ割り当てられていないため、多対多テーブルが正しく同期されないと思います。

逆に、他の参加者はデータベースに保存されない場合があります。いずれにせよ、信号を使用するかどうかに関係なく、保存中にこの数に依存することはできません。この計算を行う別の方法を用意することをお勧めします。よりクリーンになり、保存パフォーマンスが向上し、保存せずに呼び出すことができます。

于 2009-06-08T16:47:34.300 に答える
0

save メソッドをオーバーライドする代わりに、pre-save signalを使用することをお勧めします。コードを少しきれいにするだけでなく、次のような奇妙な問題を回避するのにも役立ちます:)

于 2009-06-06T20:55:53.473 に答える