Подскажите, пожалуйста, как я могу вывести вывод в нужном мне формате с помощью вложенных сериализаторов?

Я пытаюсь отправлять сообщения, используя фреймворк 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. Поэтому лучше переименовать MessageModel в Message.


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 the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: The related_name=… parameter [Django-doc] is the name of the relation in reverse, so from the User model to the MessageModel model 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 the user relation to messages.

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