Обновление вложенного пользовательского сериализатора с изображением аватара

Я хочу добавить изображение аватара в сериализатор профиля, который вложен в сериализатор пользователя как поле один-к-одному. У меня возникли проблемы с загрузкой файла на фронт-энде, и я хочу убедиться, что у меня все правильно в моем бэкэнде 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)

Пожалуйста, посмотрите! Я очень застрял на этом (все еще учусь!) и не уверен, что делаю неправильно. Я хочу убедиться, что с бэкендом все в порядке, прежде чем продолжить исследование полезной нагрузки на фронтенде. Любая помощь будет очень признательна.

Вернуться на верх