Проблема с медиа файлами с Django
Разрабатываю REST API на Django для сайта с товарами, где у каждого продукта может быть несколько медиафайлов (изображения и видео). Реализовал связь один-ко-многим (1:N) между моделями Product и Media. Создал отдельные сериализаторы для Product и Media, но столкнулся с проблемой: при отправке POST-запроса через Postman файлы не передаются. Не могу понять, в чём именно заключается ошибка - в настройках сериализаторов, вьюсетов или в формировании запроса, файл не находит.
models.py
class Product(models.Model):
name = models.CharField(max_length=255)
category = models.ForeignKey(ProductCategories, on_delete=models.CASCADE)
seller = models.ForeignKey(
Seller, on_delete=models.CASCADE, related_name='products')
description = models.TextField()
gender = models.CharField(max_length=10, blank=True, choices=[
('male', 'Male'),
('female', 'Female'),
('unisex', 'Unisex'),
])
price = models.DecimalField(max_digits=10, decimal_places=2)
previous_price = models.DecimalField(
max_digits=10, decimal_places=2, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
is_published = models.BooleanField(default=True)
tags = models.CharField(max_length=250, blank=True)
search_vector = SearchVectorField(null=True)
views = models.IntegerField(default=0)
def __str__(self):
return self.name
class Meta:
indexes = [GinIndex(fields=['search_vector'])]
ordering = ['-created_at']
class ProductMedia(models.Model):
product = models.ForeignKey(
Product, on_delete=models.CASCADE, related_name='media')
file = models.FileField(upload_to='products/')
is_image = models.BooleanField(default=False)
is_video = models.BooleanField(default=False)
is_main = models.BooleanField(default=False)
def __str__(self):
return f'{self.product.name} - {self.is_main}'
serializer
class ProductMediaSerializer(serializers.ModelSerializer):
class Meta:
model = ProductMedia
fields = ('id', 'file', 'is_image', 'is_video', 'is_main')
class ProductRetrieveSerializer(serializers.ModelSerializer):
category = serializers.CharField(required=True)
seller = SellerSerializer(read_only=True)
media = ProductMediaSerializer(many=True, required=True)
class Meta:
model = Product
fields = (
'id', 'name', 'category', 'seller', 'media', 'description', 'gender', 'price',
'previous_price', 'is_published', 'tags', 'views', 'created_at',
)
def create(self, validated_data):
category = validated_data.pop('category')
media = validated_data.pop('media')
validated_data['category'] = ProductCategories.objects.get(
name=category)
user = self.context['request'].user
validated_data['seller'] = Seller.objects.get(user=user)
product = Product.objects.create(**validated_data)
product.save()
for item in media:
ProductMedia.objects.create(product=product, **item)
return product
views
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductRetrieveSerializer
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = ProductFilter
parser_classes = (MultiPartParser, FormParser, FileUploadParser)
permission_classes = (IsSellerOrReadOnly,)
search_fields = ('name', 'description', 'tags', 'search_vector')
ordering_fields = ('price', 'created_at')
Пробовал менять сериализаторы но все не приводят к тому результату чего я хочу.
Делаю в Postman POST запрос через form-data показывает как будто не картинки