Неподдерживаемый тип(ы) операнда для -: 'decimal.Decimal' и 'float' | Django
Иногда он работает нормально, а иногда выдает ошибку.
ADMIN
models.py
class BarterAdminWallet(models.Model):
admin_wallet_id = models.BigAutoField(primary_key=True)
admin_wallet_balance = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
admin_tokens_assigned = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
admin_tokens_earned = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
admin_tokens_bought = models.DecimalField(max_digits=60, decimal_places=2, default = 0.00)
class BarterAdminActionsTokens(models.Model):
action_tokens_id = models.BigAutoField(primary_key=True)
account_activation_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
newsletter_subscription_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
name_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
surname_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
add_languages_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
mobile_phone_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
avatar_image_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
profile_description_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
dob_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
linkedin_profile_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
facebook_profile_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
address_1_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
address_2_tokens = models.DecimalField(max_digits=30, decimal_places=2, default = 0.00)
USER
views.py
adminwallet = BarterAdminActionsTokens.objects.get()
registration_tokens = adminwallet.account_activation_tokens
adminwallet = BarterAdminWallet.objects.get()
adminwallet.admin_wallet_balance = adminwallet.admin_wallet_balance - float(registration_tokens)
adminwallet.admin_tokens_assigned = adminwallet.admin_tokens_assigned + float(registration_tokens)
adminwallet.save()
token_status.user_account_activation_token_status = "Awarded"
token_status.save()
ОБЪЯСНЕНИЕ КОДА
- Все области, связанные с математикой, имеют десятичную систему счисления.
- Тот же код, при вычислении иногда вычисляет идеально, а иногда показывает ошибку.
- Также этот код работает абсолютно нормально в других приложениях.
Как отметил @Abdul Aziz, этот вопрос должен решить проблему.
Вы добавляете float
и decimal.Decimal()
, которые могут выглядеть похожими, но являются очень разными.
float дает приближенное значение объявленного числа. Например, если вы печатаете 0.2 с 12 знаками после запятой, вы получаете не 0.2, а приближенное значение.
Децимальные числа, с другой стороны, обеспечивают точность и Децимальные числа могут страдать от своих собственных проблем с точностью, но в целом, десятичные числа более точны, чем плавающие.
adminwallet.admin_wallet_balance = adminwallet.admin_wallet_balance - registration_tokens
adminwallet.admin_tokens_assigned = adminwallet.admin_tokens_assigned + registration_tokens
Одного этого должно быть достаточно.
Документация: https://docs.python.org/3/library/decimal.html