Невозможно отфильтровать поле 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?
- Есть ли лучший подход или обходной путь для решения этой проблемы фильтрации?
Любые соображения или предложения будут высоко оценены!