Как вложить некоторые поля 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 )
Это должно работать идеально.