视图中的 Django sql 错误但不是通过管理员

Django sql error in view but not via admin

我遇到 unsupported operand type(s) for +: 'float' and 'decimal.Decimal' 错误。当我在我的 update_account 函数中调试我的代码时,我可以看到 instance.amount 是 <class 'float'> 并且 a.balance 是 <class 'decimal.Decimal'> 所以错误是有道理的。现在,如果我要在我的管理页面中手动添加 Transaction(user=id, type='deposit', description='Venmo inc', amount=200.00),代码不会抛出错误。两种类型都是<class 'decimal.Decimal'>。为什么通过我的管理员添加事务有效,但通过我的视图添加事务会引发错误?我该如何处理这个错误?

型号:

class Account(models.Model):
    user = models.CharField(max_length=30)
    balance = models.DecimalField(max_digits=500, decimal_places=2)

class Transaction(models.Model):
    user = models.CharField(max_length=30)
    type = models.CharField(max_length=10)
    description = models.CharField(max_length=30)
    amount = models.DecimalField(max_digits=5, decimal_places=2)

@receiver(post_save, sender=Transaction)
def update_account(sender, instance, created, **kwargs):
    if created:
        user = instance.user
        a = Account.objects.get(user=user)
        #error occurs here
        a.balance = instance.amount + a.balance 
        a.save()

查看:

def transaction(request):
    id = request.user.id
    t = Transaction(user=id, type='deposit', description='Venmo inc', amount=200.00)
    t.save()
    return HttpResponse('Transaction Complete')

很有可能是因为django admin知道数据库字段的类型并进行了内部转换。你的观点不那么聪明,你需要将浮点数强制转换为十进制


from decimal import Decimal

# Quick and dirty hack
def transaction(request):
    id = request.user.id
    t = Transaction(user=id, type='deposit', description='Venmo inc', amount=Decimal(200.00))
    t.save()
    return HttpResponse('Transaction Complete')

更好的方法是在模型 save() 方法中检查金额是否为浮点数,如果不是,则进行转换。