我正在尝试为基于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.
答案 0 :(得分:2)
您必须在之前保存您的对象,您可以通过多对多关系。
请说明如何在单笔交易中拥有多个买家和卖家。 (对于这个答案的其余部分,我假设没有,你的意思是ForeignKey
字段。)
买家和卖家的相关名称不明确。见下文。
我不确定description
的用途。它与项目清单不同吗?
item
应该被称为items
,因为它可以是复数,并且您可能想要创建一个自定义联结表(使用“through”参数)和数量字段。 / p>
您忘记保存相关对象。
修改版本:
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)
buyer
和seller
字段是多个字段,因此self.buyer
永远不会有效,我认为您的意思是使用ForeignKey
代替ManyToManyField