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)
Когда я делаю запрос, кажется, что поле баннера не учитывается.
Вот мой ответ :
{
"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