Как загрузить несколько изображений в модель продукта 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)
Я хотя бы попытался объяснить вам способ загрузки нескольких изображений. Удачи :)