Исключение Django: decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

У меня странное поведение в коде.

Моя модель:

class Item(models.Model):
    ....
    price = models.DecimalField(max_digits=5, decimal_places=2, help_text="Цена товара", verbose_name="Цена")
    # price = models.IntegerField(help_text="Цена товара", verbose_name="Цена")

Когда я пытаюсь фильтровать объект:

class ProductBuyView(APIView):
    def get(self, request, item_uuid: str, format=None):
        product = Item.objects.all().filter(uuid__exact=uuid.UUID(item_uuid))[0]
        ...

Я получаю исключение

File "/home/lev/python_projects/taste_case_stripe/stripe_app/views.py", line 14, in get
    product = Item.objects.all().filter(uuid__exact=uuid.UUID(item_uuid))[0]
  File "/home/lev/python_projects/taste_case_stripe/venv/lib/python3.10/site-packages/django/db/models/query.py", line 445, in __getitem__
    qs._fetch_all()
  File "/home/lev/python_projects/taste_case_stripe/venv/lib/python3.10/site-packages/django/db/models/query.py", line 1866, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/home/lev/python_projects/taste_case_stripe/venv/lib/python3.10/site-packages/django/db/models/query.py", line 117, in __iter__
    for row in compiler.results_iter(results):
  File "/home/lev/python_projects/taste_case_stripe/venv/lib/python3.10/site-packages/django/db/models/sql/compiler.py", line 1333, in apply_converters
    value = converter(value, expression, connection)
  File "/home/lev/python_projects/taste_case_stripe/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/operations.py", line 344, in converter
    return create_decimal(value).quantize(
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

...decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

но когда я меняю тип поля на Int

class Item(models.Model):
    ....
    price = models.IntegerField(help_text="Цена товара", verbose_name="Цена")

все в порядке. Как я полагаю, проблема в десятичном поле. Но что с ним не так...

попробуйте это:

from django.db import models
from django.db.models import Model
# Create your models here.

class DecimalModel(Model):
    geeks_field = models.DecimalField(
                     max_digits = 5,
                     decimal_places = 2)

в просмотре:

from geeks.models import DecimalModel

# importing datetime module
import decimal

# creating an instance of 
# datetime.date
d = decimal.Decimal(9.53)

# creating an instance of 
# DecimalModel
my_object = DecimalModel.objects.create(geeks_field = d)
my_object.save()

Я предполагаю, что в вашей базе данных есть какая-то проблема с данными. Можете ли вы удалить все данные из вашей таблицы Item? Проблема должна исчезнуть после этого. Как я вижу, вы используете SQLight, поэтому вы можете скопировать файл базы данных в качестве резервной копии и попробовать очистить таблицу Item для диагностики источника проблемы.

Я нашел это. Я изменил DB на MySQL. И выполнил тот же запрос к хранилищу MySQL. В этом случае проблема исчезла.

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