Ошибка: 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

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