Подскажите, пожалуйста, как я могу вывести вывод в нужном мне формате с помощью вложенных сериализаторов?
Я пытаюсь отправлять сообщения, используя фреймворк django-rest. Я создал сериализаторы для пользователя и сообщения. Я использую модель пользователя по умолчанию django для хранения данных пользователя.
Я вставляю свою модель и сериализаторы сюда:
class MessageModel(models.Model):
message = models.CharField(max_length=100)
created_at = models.DateTimeField(default=now)
updated_at = models.DateTimeField(default=now)
user = models.ForeignKey(User,on_delete=models.CASCADE,related_name='user')
class UserSerializer(ModelSerializer):
class Meta:
model = get_user_model()
fields = ['id','username','email']
class MessageSerializer(ModelSerializer):
created_by = UserSerializer(read_only=True)
class Meta:
model = MessageModel
fields = ['id','message', 'created_at', 'updated_at','user','created_by']
View :
class MessageViewSet(viewsets.ModelViewSet):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = MessageModel.objects.all()
serializer_class = MessageSerializer
После создания сообщения я получаю ответ, как показано ниже:
{
"id": 6,
"message": "Lorem ipsum",
"created_at": "2022-11-07T09:21:19.492219Z",
"updated_at": "2022-11-07T09:21:19.492237Z",
"user": 2
}
но мой вывод должен выглядеть в следующем формате, каждый раз, когда создается новое сообщение :
{
"id": 102,
"message": "Lorem ipsum",
"created_at": "created time in UTC",
"updated_at": "last updated time in UTC",
"created_by": {
"id": 3,
"username": "testuser",
"email": "test@mail.com",
}
}
В случае ошибки, верните сообщение об ошибке.
Заранее спасибо.
Имя поля user, а не created_by, поэтому:
class MessageSerializer(ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
model = MessageModel
fields = ['id', 'message', 'created_at', 'updated_at', 'user']
или вы можете указать user в качестве источника:
class MessageSerializer(ModelSerializer):
created_by = UserSerializer(read_only=True, source='user')
class Meta:
model = MessageModel
fields = ['id', 'message', 'created_at', 'updated_at', 'created_by']
Примечание: Модели обычно не имеют суффикса
…Model. Поэтому лучше переименоватьвMessageModelMessage.
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL[Django-doc] to refer to the user model, than to use theUsermodel [Django-doc] directly. For more information you can see the referencing theUsermodel section of the documentation.
Note: The
related_name=…parameter [Django-doc] is the name of the relation in reverse, so from theUsermodel to theMessageModelmodel in this case. Therefore it (often) makes not much sense to name it the same as the forward relation. You thus might want to consider renaming therelation tousermessages.