Как загрузить несколько изображений в модель продукта django с помощью DRF

В настоящее время я могу загрузить только 1 изображение на товар.

Моя модель

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(null=True, blank=True,
                              default='/placeholder.png')
    brand = 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)
    numReviews = models.IntegerField(null=True, blank=True, default=0)
    price = models.DecimalField(
        max_digits=7, decimal_places=2, null=True, blank=True)
    countInStock = models.IntegerField(null=True, blank=True, default=0)
    createdAt = models.DateTimeField(auto_now_add=True)
    _id = models.AutoField(primary_key=True, editable=False)

Это мой сериализатор

class ProductSerializer(serializers.ModelSerializer):
    reviews = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Product
        fields = '__all__'

    def get_reviews(self, obj):
        reviews = obj.review_set.all()
        serializer = ReviewSerializer(reviews, many=True)
        return serializer.data

Это файл представлений

@api_view(['GET'])
def getProduct(request, pk):
    product = Product.objects.get(_id=pk)
    serializer = ProductSerializer(product, many=False)
    return Response(serializer.data)

Я пытаюсь также загрузить изображения в папку с тем же названием продукта, если это возможно.

Для того чтобы загрузить несколько изображений для каждого товара, необходимо изменить модель, которую вы уже разработали. Давайте посмотрим:

Ваша модель продукта должна выглядеть следующим образом-

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)
    brand = 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)
    mum_of_reviews = models.IntegerField(null=True, blank=True, 
                    default=0)
    price = models.DecimalField(
    max_digits=7, decimal_places=2, null=True, blank=True)
    stock_counter = models.IntegerField(null=True, blank=True, 
                    default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    _id = models.AutoField(primary_key=True, editable=False)

Создадим новую модель для добавления нескольких изображений для каждого продукта-

class ProductImage(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, 
              null=True, related_name='product_images')
    image = models.ImageField(null=True, blank=True,
                          default='/placeholder.png')

Давайте напишем сериализатор для них

class ProductImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductImage
        fields = '__all__'

class ProductRetriveSerializer(serializers.ModelSerializer):
    reviews = serializers.SerializerMethodField(read_only=True)
    images = serializers.SerializerMethodField(read_only=True)

   class Meta:
    model = Product
    fields = '__all__'

  def get_reviews(self, obj):
      reviews = obj.review_set.all()
      serializer = ReviewSerializer(reviews, many=True)
      return serializer.data

  def get_images(self, obj):
      images = obj.product_images.all()
      return ProductImageSerializer(images, many=True)

 class ProductCreationSerializer(serializers.ModelSerializer):
     images = ProductImageSerializer(many=True, required=False)

     class Meta:
         model = Product
         fields = '__all__'

Давайте напишем API для создания продукта с несколькими изображениями

class ProductCreateAPIView(APIView):
    parser_classes = (FormParser, MultiPartParser)
    serializer = ProductCreationSerializer

    @transaction.atomic
    def post(self, request, format=None):
        images = request.data.get('images', [])
        request.data.pop('images')
        serialized_data = self.serializer(data=request.data)
        product_obj = None
        if serialized_data.is_valid():
            product_obj=Product.objects.create(**serialized_data.validated_data)
  
       if product_obj and len(images) > 0:
           for image_data in images:
               image_data['product_id'] = str(product_obj._id)
               product_image_serialized_data = ProductImageSerializer(data=image_data)
            if product_image_serialized_data.is_valid(raise_exception=True):
              product_image_obj = ProductImage.objects.create(**product_image_serialized_data.validated_data)

    # Write your necessary code if needed
    return Response(data=serializer.data, status=status.HTTP_201_CREATED)

Я хотя бы попытался объяснить вам способ загрузки нескольких изображений. Удачи :)

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