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

问题描述 投票:0回答:3

我正在创建一个基于 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
3个回答
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


0
投票

强调文字ههفههههففففففففففففففففففففف

© www.soinside.com 2019 - 2024. All rights reserved.