J'ai un modèle utilisateur Django personnalisé et un modèle "Photo" avec une clé étrangère comme modèle "CustomUser":

class CustomUser(AbstractUser):

    REQUIRED_FIELDS = []
    USERNAME_FIELD = 'email'

    objects = CustomUserManager()
    email = models.EmailField(_('email address'), unique=True)
    username = models.CharField(max_length=10)
    bio = models.CharField(max_length=240, blank=True)
    city = models.CharField(max_length=30, blank=True)
    profile_pic = models.ImageField(null=True, blank=True)
    date_of_birth = models.DateField(blank=True, null=True)

    def __str__(self):
        return self.email

Et

class Photo(models.Model):
    image = models.ImageField(blank=False, null=False, upload_to="images")
    author = models.ForeignKey('users.CustomUser', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)

    def __str__(self):
        return self.title

J'essaie d'obtenir le champ 'profile_pic' (défini dans CustomUser) à partir de Photo Serializer mais j'obtiens une erreur utf-8. image d'erreur

Sérialiseur de photos :

class PhotoSerializer(ModelSerializer):

    email = serializers.SerializerMethodField('get_user_email')
    username = serializers.SerializerMethodField('get_username')
    profile_pic = serializers.SerializerMethodField('get_profile_pic')
    
    class Meta:
        model = Photo
        fields = ['id', 'author','image', 'title','email', 'username', 'profile_pic']

    def get_user_email(self, photo):
        email = photo.author.email
        return email

    def get_username(self, photo):
        username = photo.author.username
        return username
        
    def get_profile_pic(self, photo):
        photo_url = photo.author.profile_pic  
        return photo_url

Si je remplace get_profile_pic par le code suivant ci-dessous, cela donne l'URL de l'image correcte. Mais y a-t-il un autre moyen de le faire ? J'aimerais aussi connaître la raison de l'erreur.

def get_profile_pic(self, photo):
        request = self.context.get('request')
        photo_url = photo.author.profile_pic  
        photo_url = 'media/' + str(photo_url)
        return request.build_absolute_uri(photo_url)
1
tej 4 nov. 2020 à 17:21

1 réponse

Meilleure réponse

Votre méthode get_profile_pic renvoie un objet ImageFieldFile au lieu de str.

Vous devez utiliser la propriété url :

def get_profile_pic(self, photo):
    photo_url = photo.author.profile_pic.url
    return photo_url

Voir Utiliser des fichiers dans des modèles

0
Antoine Pinsard 4 nov. 2020 à 15:02