이미지 필드
Product 모델의 이미지 필드 생성시 하나의 파일만 업로드가 가능하게 된다. 여러장의 이미지를 업로드 하기 위해 방법을 찾아봤다.
두가지 방법을 찾을 수 있었다.
class Product(models.Model): image1 = models.ImageField("사진", blank=True, upload_to='%Y/%m/') image2 = models.ImageField("사진", blank=True, upload_to='%Y/%m/') image3 = models.ImageField("사진", blank=True, upload_to='%Y/%m/') ...
간단하게 해결이 가능하지만 정해진 개수만 업로드가 가능하다.
사용자마다 업로드하는 이미지의 개수가 다르고 정해진 개수보다 많은 이미지를 업로드하고자 하는 사람도 있을것이다.
위와 같은 상황에 사용할 수 있는 방법으로 이미지의 모델을 생성해서 FK로 연결해주는 방법이 있었다.
class ProductImage(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images') image = models.ImageField("이미지", upload_to='%Y/%m/', null=True, blank=True, default=None)
이렇게 사용하는 경우 product를 생성할때 해당 필드의 내용과 productimage를 같이 요청받아 글을 생성하게 된다.
그러기 위해 serializer에 수정을 같이 진행해줬다.# 상품 이미지 생성 시리얼라이저 class ProductImageCreateSerializer(serializers.ModelSerializer): class Meta: model = ProductImage fields = ('image',)
# 상품 등록 class ProductCreateSerializer(serializers.ModelSerializer): images = ProductImageCreateSerializer(many=True, required=False) class Meta: model = Product fields = ("title", "content", "price", "is_free", "images", "bargain", "place", "category", "refreshed_at", "is_hide",) def create(self, validated_data): print(validated_data) images_data = self.context.get('images', None) # images_data = validated_data.pop('images', None) product = super().create(validated_data) if images_data: for image_data in images_data: print(images_data) print(type(images_data)) print(image_data) print(type(image_data)) ProductImage.objects.create(product=product, image=image_data) # ProductImage.objects.create(product=product, **image_data) return product
related_name을 설정해줬기 때문에 product를 생성할때 같이 저장될 수 있도록 ProductCreateSerializer에 images를 ProductImageCreateSerializer로 설정한다.
++ print문들은 아래에서 언급할 오류를 해결하기 위해 작성한 것으로 추후 글을 다시 작성하면서 정리해야겠다.
여기서 실제 프론트랑 연결해서 저장을 진행했을때 저장이 안되는 오류를 겪었다. 튜터님의 도움을 받아 요청이 들어오는 상태와 타입을 파악한 뒤 views.py에서 수동으로 직렬화를 진행하여 오류를 해결했다. 프로젝트 마무리 후 시간내서 다시 확인해봐야 겠다.
++ print문들은 아래에서 언급할 오류를 해결하기 위해 작성한 것으로 추후 글을 다시 작성하면서 정리해야겠다.# 상품 등록 """로그인 사용자""" class ProductCreateView(APIView): permission_classes = [permissions.IsAuthenticated] def post(self, request): print(request.user) serializer = ProductCreateSerializer(data=request.data, context={"images":request.data.getlist("images")}) print(request.data) if serializer.is_valid(): serializer.save(user=request.user) return Response(serializer.data, status=status.HTTP_200_OK) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)