Как загрузить несколько изображений с помощью django rest framework CreateAPI в поле зрения и создать метод в сериализаторах - PullRequest
0 голосов
/ 02 августа 2020

У меня есть сериализатор сообщений и сериализатор postimage для загрузки нескольких изображений в сообщение. У меня есть этот сериализатор, но я не уверен, как это сделать, чтобы я мог загружать несколько изображений, например 5 изображений с одним сообщением, например, как мы используем с наборами форм, потому что теперь я могу загрузить только 1 изображение в 'images' поле.

Это сериализаторы. Пожалуйста, посмотрите и дайте мне знать, какие изменения мне нужно внести ...

Спасибо

class PostImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PostImage
        fields = ['id', 'images',]

class PostSerializer(TaggitSerializer, serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.username')
    post_date = serializers.ReadOnlyField()
    postimage_set = PostImageSerializer(many=True)
    likes = UserSerializer(many=True)
    class Meta:
        model = Post
        fields = ['id','title', 'post_date', 'updated', 'user', 'image', 'postimage_set']

    def create(self,validated_data):
        user = self.context['request'].user
        title = validated_data['title']
        image = self.context['request'].FILES.get('image')
        images = self.context['request'].FILES.get('images')

        m1 = Post(user=user,title=title,image=image,)
        m1.save()
        m2 = PostImage(post=m1, images= images)
        m2.save()
        validated_data['images']=m2.images
        validated_data['image']=m1.image
        return validated_data

просмотров

class CreatePostAPIView(generics.CreateAPIView):
    serializer_class = PostCreateSerializer
    permission_classes = [IsAuthenticated]

    def create(self, request, *args, **kwargs):
        serializer = PostCreateSerializer(data=request.data, context={'request':request,})
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Я бы так и сделал. Создайте PostModel и PostImageModel (с иностранным ключом поста) для каждого изображения поста. А затем в сериализаторе создайте поле отношения с обоими. Примерно так:

models.py

class Post(Model):
    post details ...

class PostImage(Model):
    post = models.ForeigKey(Post, ...)
    image = models.ImageField(...)

serializers.py

class PostImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = PostImage
        fields = '__all__'

class PostSerializer(serialiers.ModelSerializer):
    
    images = serializers.SlugRelatedField(slug_field='image', many=True, ...)

    class Meta:
        model = Post
        fields = [..., 'images']

просмотров .py

class CreatePostView(CreateView):
    classForm = PostForm (with images field)
    
    def form_valid(self, form):
        new_post = form.save(commit=False)
        for image in new_post.images:
            new_image = PostImage(post=new_post, image=image)
            new_image.save()
        new_post.save()
        return super()form_valid(form)

Итак, в вашем API вы должны увидеть модель публикации с прикрепленными к ней изображениями.

0 голосов
/ 03 августа 2020

Это решило проблему

def create(self, validated_date):
    images = self.context['request'].FILES.getlist('images')

    for image in list(images):
        m2 = PostImage(post=m1, images= image)
        m2.save()
0 голосов
/ 02 августа 2020

Вот как вы выполняете многократную загрузку на drf: в примере ниже при создании вы можете получить доступ к нескольким опубликованным вами элементам:

например, опубликовано:

Formdata

images: File.jpeg
images: File2.jpeg
images: File3.jpeg

class TestSerializer(serializers.Serializer):
    images = serializers.ListField(child=serializers.FileField())


class CreatePostAPIView(generics.CreateAPIView):
    permission_classes = [AllowAny]
    serializer_class = TestSerializer

    def create(self, request, *args, **kwargs):
        images = request.data['images']
...