Невозможно отфильтровать поле Decimal128 в MongoDB с помощью Django, но можно отфильтровать целочисленные и строковые поля

Я работаю над проектом Django, используя MongoDB в качестве базы данных. У меня есть модель Product с полем Decimal128 для хранения цен на товары. Я пытаюсь фильтровать товары на основе цены, но сталкиваюсь с проблемами при попытке фильтрации с помощью поля Decimal128.

Вот соответствующая часть моего кода:

class FilterProducts(View):
    def get(self, request):
        try:
            category = request.GET.get("category")
            min_prices = request.GET.get("min_price")
            max_price = request.GET.get("max_price")

            all_products = Product.objects.all()

            if category:
                all_products = all_products.filter(category=category)

            if min_prices:
                all_products = all_products.filter(price__gte=min_prices)
                print(min_prices)

            if max_price:
                all_products = all_products.filter(price__lte=max_price)

            response = [
                {
                    "title": product.name,
                    "category": product.category,
                    "price": product.price.to_decimal(),
                    "description": product.description,
                }
                for product in all_products
            ]

            return JsonResponse(response, status=200, safe=False)

        except Exception as e:
            return HttpResponseBadRequest(str(e), status=400)

Ниже приведена модель, созданная для Product:

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    image = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)
    shipping = models.CharField(max_length=100)
    description = models.TextField(max_length=500)
    price = models.DecimalField(decimal_places=2, max_digits=8)
    category = models.CharField(max_length=100)
    is_featured = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

Выпуск:

  • Когда я пытаюсь отфильтровать поле цены Decimal128, результаты не возвращаются, даже когда я знаю, что соответствующие данные существуют.
  • Фильтрация на основе целочисленных или строковых полей работает совершенно нормально, как Category.
  • Я пробовал преобразовывать значение фильтра цены в Decimal128 и Decimal, но, похоже, это все равно не работает.

Что я пробовал:

  • Убедились, что данные о цене хранятся в MongoDB в формате Decimal128.
  • Использовал Decimal128(Decimal(value)) для создания значения фильтра.
  • Дважды проверил точность десятичных значений, чтобы убедиться, что они соответствуют хранимым значениям.

Вопросы:

  • Есть ли что-то особенное в фильтрации полей Decimal128 в MongoDB, что я упускаю?
  • Как правильно фильтровать товары на основе поля цены Decimal128, используя Django и MongoDB?
  • Есть ли лучший подход или обходной путь для решения этой проблемы фильтрации?

Любые соображения или предложения будут высоко оценены!

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