基于Django的市场,创建交易历史

时间:2010-11-29 01:21:16

标签: django django-models

我正在尝试为基于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 个答案:

答案 0 :(得分:2)

  1. 您必须在之前保存您的对象,您可以通过多对多关系。

  2. 请说明如何在单笔交易中拥有多个买家和卖家。 (对于这个答案的其余部分,我假设没有,你的意思是ForeignKey字段。)

  3. 买家和卖家的相关名称不明确。见下文。

  4. 我不确定description的用途。它与项目清单不同吗?

  5. item应该被称为items,因为它可以是复数,并且您可能想要创建一个自定义联结表(使用“through”参数)和数量字段。 / p>

  6. 您忘记保存相关对象。

  7. 修改版本:

    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()
    

答案 1 :(得分:1)

buyerseller字段是多个字段,因此self.buyer永远不会有效,我认为您的意思是使用ForeignKey代替ManyToManyField