【问题标题】:How to save multiple videos and images in Django Rest Framework?如何在 Django Rest Framework 中保存多个视频和图像?
【发布时间】:2020-06-24 20:35:16
【问题描述】:

我正在创建一个基于 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?
            """
            

以及如何验证文件是否只是图像或视频。如果有人发布除图像或视频之外的任何其他内容,则会出现验证错误。有什么好的办法吗?

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

    我是这样想的

    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
    

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 2019-03-24
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多