Как вложить некоторые поля UserModel в другой сериализатор

У меня есть имя модели Комментарий следующим образом.

class Comment(models.Model):
    message = models.CharField(max_length=1000)
    time = models.DateTimeField(auto_now_add=True)
    sender = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='usercomment')

    def __str__(self):
        return self.sender.name

Для этой модели у меня есть сериализатор

class CommentSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    time = serializers.DateTimeField(read_only=True)
    message = serializers.CharField(read_only=True)
    
    sender = serializers.PrimaryKeyRelatedField(read_only=True, many=False)
    name = serializers.StringRelatedField(
        source='sender', read_only=True, many=False)

Я хочу получить поле аватара из модели использования, поэтому я иду с новым стерилизатором для вложения в комментарии

class SenderInformation(serializers.Serializer):
    avatar = serializers.ImageField(read_only=True)

Основная цель - принести поле аватара, связанное с отправителем, так как я уже получаю id пользователя в поле send и имя тоже, но есть ли другой способ получить аватар пользователя вместо вложения нескольких полей из используемой модели. ? Как я могу этого добиться?

Добавьте поле ImageField в вашу модель:

class Comment(models.Model):
    message = models.CharField(max_length=1000)
    time = models.DateTimeField(auto_now_add=True),
    avatar = models.ImageField(),
    sender = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='usercomment')
    def __str__(self):
        return self.sender.name

В вашем файле forms.py

from django import forms

class CommentForm(forms.Form):

    message = forms.CharField(max_length=1000)
    time = forms.DateTimeField(auto_now_add=True),
    avatar = forms.ImageField()

Вы называете это в своем представлении так:

f = CommentForm(request.GET)

Попробуйте StringRelatedField. Вы уже используете его для получения имени отправителя, которое извлекается из модели пользователя. Поэтому, чтобы получить аватар, вы можете сделать следующее:

avatar = serializers.StringRelatedField(source='sender.avatar', read_only=True, many=False)

Таким образом, полный CommentSerializer будет выглядеть следующим образом.

class CommentSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    time = serializers.DateTimeField(read_only=True)
    message = serializers.CharField(read_only=True)
    sender = serializers.PrimaryKeyRelatedField(read_only=True, many=False)
    avatar = serializers.StringRelatedField(
        source='sender.avatar', read_only=True, many=False)
    name = serializers.StringRelatedField(
        source='sender', read_only=True, many=False)

Вы можете учиться, читая docs также.

Но есть одна проблема с этим, он вернет путь как строку. Поэтому для этой цели следует использовать простое поле ImageField.

avatar = serializers.ImageField(source='sender.avatar', read_only=True )

Это должно работать идеально.

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