如何在 Django Rest Framework 中保存多个视频和图像?

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

我正在创建一个基于 Django 的 Web 应用程序,其中 Post 模型将包含多个图像和视频。我想上传图片模型中的多张图片和视频模型中的视频

# 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?
            """
            

以及如何验证文件是图片还是视频。如果某人 post 除了图像或视频之外的任何其他东西,那么它将给出验证错误。有什么好的方法吗?

您可以为此使用嵌套序列化程序 https://www.django-rest-framework.org/api-guide/relations/#nested-relationships

我是这样想出来的

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