Ошибка: decimal.InvalidOperation: [<класс 'decimal.ConversionSyntax'>] в Django
Django View:
@api_view(['PUT'])
@permission_classes([IsAdminUser])
def updateProduct(request, pk):
data = request.data
product = Product.objects.get(_id=pk)
product.name = data['name'],
product.price = data['price'],
product.category = data['category']
product.description = data['description']
product.countInStock = data['countInStock']
print(data)
serializer = ProductSerializer(product, many =False)
return (Response(serializer.data))
Models.py:
class Product(models.Model):
user = models.ForeignKey(User, on_delete = models.SET_NULL, null=True)
name = models.CharField(max_length = 200, null= True, blank= True)
image = models.ImageField(default="/place.jpg",null= True, blank= True)
netWeight = models.CharField(max_length = 200, null= True, blank= True)
category = models.CharField(max_length = 200, null= True, blank= True)
description = models.TextField(null = True, blank= True)
rating = models.DecimalField(max_digits = 7, decimal_places = 2,null= True, blank= True)
price = models.DecimalField(max_digits = 7, decimal_places = 2,null= True, blank= True)
numReviews = models.IntegerField(null= True, blank= True, default=0)
countInStock = models.IntegerField(null= True, blank= True, default=0)
createdAt = models.DateTimeField(auto_now_add=True)
_id = models.AutoField(primary_key=True, editable=False)
Product Action.js (React):
export const listProductUpdate = (product) => async (dispatch, getState) => {
try {
dispatch({
type: PRODUCT_UPDATE_REQUEST
})
const {
userLogin: { userInfo },
} = getState()
const config = {
headers: {
'Content-type': 'application/json',
Authorization: `Bearer ${userInfo.token}`
}
}
const { data } = await axios.put(
`/api/products/update/${product._id}/`,
product,
config
)
dispatch({
type: PRODUCT_UPDATE_SUCCESS,
payload: data
})
dispatch({
type: PRODUCT_DETAILS_SUCCESS,
payload: data
})
} catch (error) {
dispatch({
type: PRODUCT_UPDATE_FAIL,
payload: error.response && error.response.data.detail
? error.response.data.detail
: error.message,
})
}
}
Я использовал React в качестве фронтенда и Django в качестве бэкенда. Данные, отправленные из формы, используются как строка. Как преобразовать 'Price' и 'CountInStock' в значение DecimalField? При запуске действия с фронтенда, товар не обновляется и выдается вышеупомянутая ошибка. Может ли кто-нибудь помочь мне решить эту проблему
Вы можете зарегистрировать некоторое десятичное значение Django, используя объект python deimal.Decimal
. Преобразование строки в int с помощью int('string_number') выглядит следующим образом :
from decimal import Decimal
def updateProduct(request, pk):
# Some code here
product.price = Decimal(data['price']),
product.countInStock = int(data['countInStock'])
# Some stuff here
NB : Здесь мы предполагаем, что все проверки для объектов Decimal
и int
уже проверены во фронтенде. Это означает, что data['price']
должно быть действительным десятичным числом после преобразования, а data['countInStock']
- действительным числом int после преобразования.
Документ Decimal doc