Неподдерживаемый тип(ы) операнда для -: '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

Вернуться на верх