Django S3 : Сохранение изображений не работает при вызове сериализатора

Мне нужно создать API для загрузки изображений на веб-сайт.

Я уже создал в своих моделях метод сохранения для загрузки и изменения размера изображений.

Страница администрирования django работает правильно.

К сожалению, когда я использую свой сериализатор, изображение не сохраняется.

Вот моя модель :

models.py

class Shop(models.Model):

    name = models.CharField(max_length=255)
    category = models.ForeignKey(ShopCategory, on_delete=models.SET_NULL, null=True, blank=True)
    description = models.TextField(blank=True, null=True)
    path = models.CharField(max_length=255, unique=True, null=True, blank=True)
    mustBeLogged = models.BooleanField(default=False)
    deliveries = models.FloatField(validators=[MinValueValidator(0),], default=7)
    message = models.TextField(null=True, blank=True)
    banner = models.ImageField(null=True, blank=True)

    def save(self, *args, **kwargs):
        try:
            """If we want to update"""
            this = Shop.objects.get(id=self.id)
            if self.banner:
                image_resize(self.banner, 300, 300)
                if this.banner != self.banner:
                    this.banner.delete(save=False)
            else:
                this.banner.delete(save=False)
        except:
            """If we want to create a shop"""
            if self.banner:
                image_resize(self.banner, 300, 300)
        super().save(*args, **kwargs)

    def delete(self):
        self.banner.delete(save=False)
        super().delete()
        
    def __str__(self):
        return self.name

banner это поле изображения, которое я должен сохранить.

Вот мой сериализатор :

serializers.py

class ShopSerializer(serializers.ModelSerializer):
    links = serializers.SerializerMethodField()
    isOwner = serializers.SerializerMethodField()
    banner = serializers.SerializerMethodField()

    class Meta:
        model = Shop
        fields = '__all__'

    def get_links(self, obj):
        links = Link.objects.filter(shop=obj)
        data = LinkSerializer(links, many=True).data
        return data

    def get_banner(self, obj):
        """Get a link for the banner"""
        if obj.banner:
            url = f"https://myurl/v1/images/{obj.banner.name}"
            return url

    def get_isOwner(self, obj):
        request = self.context.get("request")
        if request and hasattr(request, "user"):
            user = request.user
            try:
                if UserShop.objects.get(user=user, shop=obj):
                    return True
                return False
            except:
                return False
        return False

    def create(self, validated_data):
        path = validated_data["name"].replace(" ", "-").lower()
        path = unidecode.unidecode(path)
        unique = False
        while unique == False:
            if len(Shop.objects.filter(path=path)) == 0:
                unique = True
            else:
                # Generate a random string
                char = "abcdefghijklmnopqrstuvwxyz"
                path += "-{}".format("".join(random.sample(char, 5)))
        shop = Shop.objects.create(**validated_data, path=path)
        shop.save()
        return shop
    
    def update(self, instance, validated_data):
        #You will have path in validated_data
        #And you may have to check if the values are null
        return super(ShopSerializer, self).update(instance, validated_data)

А вот представление, в котором я вызываю свой сериализатор :

views.py

class ShopList(ShopListView):
    """Create shop"""

    def post(self, request):
        """For admin to create shop"""
        serializer = ShopSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

Вот моя просьба : Requests

Когда я делаю запрос, кажется, что поле баннера не учитывается.

Вот мой ответ :

{
    "id": 15,
    "links": [],
    "isOwner": false,
    "banner": null,
    "name": "Numero Uno bis",
    "description": "Blablabla",
    "path": "numero-uno-bis-shtfq",
    "mustBeLogged": true,
    "deliveries": 7.0,
    "message": "test",
    "category": 1
}

Thank you by advance for your help
Вернуться на верх