2010-11-29 78 views
0

我試圖在基於Django的市場上爲每個交易創建交易歷史記錄。基於Django的市場,創建交易歷史記錄

我認爲跟蹤這些數據的最好方法是覆蓋save()函數並創建一個Transaction記錄。

class Transaction(models.Model): 
    item = models.ManyToManyField(Item, blank=True) 
    buyer = models.ManyToManyField(User, related_name='buyer') 
    seller = models.ManyToManyField(User, related_name='seller') 
    description = models.CharField(max_length=500) 
    purchase_date = models.DateField(auto_now_add=True) 
    value = models.DecimalField(max_digits=7, decimal_places=2) 
    def save(self, *args, **kwargs): 
     self.buyer.money+=self.value 
     self.seller.money-=self.value 
     super(Transaction, self).save(*args, **kwargs) 

我對這一切都錯了嗎? Currenlty我得到...

'Transaction' instance needs to have a primary key value before a many-to-many relationship can be used. 

回答

2
  1. 你必須保存你的對象,你可以經歷許多一對多的關係之前

  2. 請解釋如何在一次交易中擁有多個買家和賣家。 (對於這個答案的其餘部分,我假設沒有和你的意思是這些是ForeignKey字段。)

  3. 買方和賣方的相關名稱不清楚。見下文。

  4. 我不確定description的用途。它與項目列表不同嗎?

  5. item應該叫items,因爲它可以是多個,你可能希望創建一個自定義的結表(使用「通過」參數)與數量字段。

  6. 忘記保存相關對象。

修改的版本:

class Transaction(models.Model): 
    items = models.ManyToManyField(Item, through='TransactionItem', blank=True) 
    buyer = models.ForeignKey(User, related_name='transactions_as_buyer') 
    seller = models.ForeignKey(User, related_name='transactions_as_seller') 
    description = models.CharField(max_length=500) 
    purchase_date = models.DateField(auto_now_add=True) 
    value = models.DecimalField(max_digits=7, decimal_places=2) 

    def save(self, *args, **kwargs): 
     super(Transaction, self).save(*args, **kwargs) 
     self.buyer.money += self.value 
     self.buyer.save() 
     self.seller.money -= self.value 
     self.seller.save() 

class TransactionItem(models.Model): 
    transaction = models.ForeignKey(Transaction) 
    item = models.ForeignKey(Item) 
    quantity = models.IntegerField() 
+0

這不僅是一個偉大的答案。我們可能是親戚。 – bdd 2010-11-29 04:16:16

1

buyerseller領域是多對多的字段,以便self.buyer不會有任何效果,我想你的意思使用ForeignKey而不是ManyToManyField