How to save multiple videos and images in Django Rest Framework?

Viewed 1575

I am creating a Django based web application, where Post Model will have multiple images and videos. I want to upload those multiple images in images model and videos in video model

# models.py
#Post Model
class Post(models.Model):
    # Owner / user
    user = models.ForeignKey(to=User, on_delete=models.CASCADE)
    caption = models.CharField(max_length=64, verbose_name='Post Caption')
    body = models.CharField(max_length=1024, verbose_name='Post Body')

    def __str__(self):
        return self.user.email

    def get_author(self):
        return self.user.email

class Image(models.Model):
    
    post = models.OneToOneField(to=Post, on_delete=models.CASCADE)
    image = models.ImageField()

class Video(models.Model):
    
    post = models.OneToOneField(to=Post, on_delete=models.CASCADE)
    image = models.FileField()    

# serializers.py
class PropertySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Property
        fields = '__all__'

    def create(self, validated_data):
        media_files = self.context.get('view').request.FILES
        post = Property.objects.create(
            **validated_data
            )
        for file in media_files.values():
            """
            if file is video:
                  then file will be saved in video model 
            if file is image:
                  then file will be saved in image model
            How to do it?
            """
            

And how to validate if files are only image or video. If someone post any other things except image or video then it will give validation error. Is there any good way to it?

2 Answers

I have figured it out this way

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post_Images
        fields = (
            'post',
            'image',
            'image_name'
        )
class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post_Video
        fields = (
            'post',
            'video',
            'video_name'
        )
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = (
            'id','user','caption','body'
        )

views.py

class MediaCreateView(APIView):
    parser_classes = (MultiPartParser, FormParser)
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAgentOrIsOwner]
    serializer_class = None
    media = None

    def modify_input_for_multiple_files(self, post_id, file, name):
        obj = {'post': post_id,
               f"{self.media}": file,
               f"{self.media}_name": name,
               }
        return obj
    # post method
    def post(self, request, pk):
        
        # converts query dict to original dict
        media = dict(request.data.lists())[self.media]
        names = dict(request.data.lists())[f"{self.media}_name"]
        media_name_list = list(zip(media, names))
        print(media_name_list)
        flag = 1
        arr = []
        for element in media_name_list:
            modified_data = self.modify_input_for_multiple_files(pk,
                                                                 element[0],
                                                                 element[1])
            file_serializer = self.serializer_class(data=modified_data)
            if file_serializer.is_valid():
                file_serializer.save()
                arr.append(file_serializer.data)
            else:
                flag = 0

        if flag == 1:
            return Response(arr, status=status.HTTP_201_CREATED)
        else:
            return Response(arr, status=status.HTTP_400_BAD_REQUEST)

    def get(self, request, pk):

        images = Property_Images.objects.filter(property=pk)
        serializer = self.serializer_class(images, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)


class ImageView(MediaCreateView):
    serializer_class = ImageSerializer
    media = 'image'
    queryset = Property_Images.objects.all()
    queryobject = Property_Images.objects


class VideoView(MediaCreateView):
    serializer_class = VideoSerializer
    media = 'video'
    queryset = Property_Video.objects.all()
    queryobject = Property_Video.objects
Related