视图中的 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() 方法中检查金额是否为浮点数,如果不是,则进行转换。
我遇到 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() 方法中检查金额是否为浮点数,如果不是,则进行转换。