Django DecimalField не удается сохранить, даже если я задаю ему плавающее число

class WithdrawRequests(models.Model):
    withdraw_hash = models.CharField(max_length=255, unique=True, db_index=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    username = models.CharField(max_length=255, unique=False, db_index=True)
    currency = models.CharField(max_length=255, unique=False, db_index=True)
    user_balance = models.DecimalField(max_digits=300, default=0.0, decimal_places=150)
    withdraw_address = models.CharField(max_length=255, unique=False, db_index=True)
    withdraw_amount = models.DecimalField(max_digits=30, default=0.0, decimal_places=15)

Это мой файл models.py.

currency = request.data['currency']
        payload = jwt.decode(token, settings.SECRET_KEY)
        user = User.objects.get(id=payload['user_id'])
        timestamp = datetime.datetime.now()
        timestamp = timestamp.timestamp()
        withdraw_hash = hashlib.sha256()
        withdraw_hash.update(str(timestamp).encode("utf-8"))
        withdraw_hash = withdraw_hash.hexdigest()
        username = user.username
        currency_balance = GAME_CURRENCIES[request.data['currency']]
        user_balance = getattr(user, currency_balance)
        withdraw_address = request.data['withdraw_address']
        withdraw_amount = request.data['withdraw_amount']

        if user_balance < withdraw_amount:
            return Response({
                            "message": "Not enough funds."
                        })
        else:
            # row format - hash timestamp username currency user_balance withdraw_address withdraw_amount
            withdraw = WithdrawRequests()
            withdraw.withdraw_hash = withdraw_hash,
            withdraw.timestamp = datetime.datetime.now(),
            withdraw.username = username,
            withdraw.currency = currency,
            withdraw.user_balance = user_balance,
            withdraw.withdraw_address = withdraw_address,
            withdraw.withdraw_amount = withdraw_amount

            withdraw.save()

Вот файл views.py. Что бы я ни делал, ошибка выглядит следующим образом.

   ...

  File "C:\Users\Msi\cover_game\cover\lib\site-packages\django\db\models\fields\__init__.py", line 1554, in to_python
    raise exceptions.ValidationError(
django.core.exceptions.ValidationError: ['“(0.011095555563904999,)” value must be a decimal number.']

Как вы можете видеть с user_balance все в порядке и это плавающее число.

“(0.011095555563904999,)” выглядит как строковое значение, а не как float. Вы должны очистить переменную withdraw_amount, удалив скобки, кавычки и запятую.

Вы можете преобразовать его вручную, используя модуль decimal в Python, и использовать decimal.Decimal() в обоих условиях так:

import decimal
withdraw_amount = decimal.Decimal(request.data['withdraw_amount'])

Я не заметил, когда писал код, но, как упомянул @AbdulAzizBarkat, решение было очень простым - удалить запятые после нескольких строк, как показано ниже

withdraw.withdraw_hash = withdraw_hash,
withdraw.timestamp = datetime.datetime.now()
withdraw.username = username
withdraw.currency = currency
withdraw.user_balance = user_balance
withdraw.withdraw_address = withdraw_address
Вернуться на верх