Обновление вложенного пользовательского сериализатора с изображением аватара
Я хочу добавить изображение аватара в сериализатор профиля, который вложен в сериализатор пользователя как поле один-к-одному. У меня возникли проблемы с загрузкой файла на фронт-энде, и я хочу убедиться, что у меня все правильно в моем бэкэнде Django DRF. Я использую Djoser для урлов с DRF API. Пожалуйста, посмотрите и дайте мне знать, если есть что-то, что я могу упустить. У меня нет ошибок с запросом "put" на фронтенде, но файл не загружается в путь к файлу аватара и, очевидно, не сохраняется во вложенном объекте пользователя. Я могу обновить аватар из DRF без проблем.
Model.py
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
name = models.CharField(max_length=100, blank=True, null=True)
occupation = models.CharField(max_length=100, blank=True, null=True)
residence = models.CharField(max_length=100, blank=True, null=True)
email = models.CharField(max_length=100, blank=True, null=True)
active_id = models.BooleanField(default=True)
avatar = models.ImageField(null=True, blank=True, upload_to ='uploads/profile_pics',default='uploads/default.jpg')
def __str__(self):
return self.user.username
# def get_image(self):
# return self.avatar.path
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
img = Image.open(self.avatar.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.avatar.path)
Serializers.py
class ProfileSerializer(serializers.ModelSerializer):
user = serializers.StringRelatedField(read_only=True)
class Meta:
model = Profile
fields = ("__all__")
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(required=False, allow_null=True)
parser_classes = (MultiPartParser, FormParser)
class Meta:
model = User
fields = ['username', 'profile', 'password', 'id']
extra_kwargs = {"password":{'write_only': True}}
def update(self, instance, validated_data):
if 'profile' in validated_data:
nested_serializer = self.fields['profile']
nested_instance = instance.profile
nested_data = validated_data.pop('profile')
nested_serializer.update(nested_instance, nested_data)
# for key, value in nested_data.items():
# setattr(instance.profile, key, value)
# instance.profile.save(update_fields=nested_data.keys())
return super(UserSerializer, self).update(instance, validated_data)
def create(self, validated_data):
return User.objects.create_user(**validated_data)
Signals.py
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from .models import Profile
User = get_user_model()
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
print('created:', created)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
Пожалуйста, посмотрите! Я очень застрял на этом (все еще учусь!) и не уверен, что делаю неправильно. Я хочу убедиться, что с бэкендом все в порядке, прежде чем продолжить исследование полезной нагрузки на фронтенде. Любая помощь будет очень признательна.