Django Rest Framework Сглаживает вложенные самоссылающиеся объекты - PullRequest
0 голосов
/ 29 сентября 2019

У меня проблема с вложенными самоссылающимися объектами.У меня есть поле responses, которое является потомками того же сериализатора, что и родительский.

Это выглядит как дерево, но я бы хотел сделать это на одном уровне.Возможно ли это простым способом?Как я могу решить эту проблему?

Модель Message:

class Message(SoftDeletionModel):

    parent = models.ForeignKey('self', null=True, blank=True, related_name='responses', on_delete=models.CASCADE)

    ...

Это мой сериализатор:

class RecursiveField(serializers.Serializer):
    def to_representation(self, value):
        serializer = self.parent.parent.__class__(value, context=self.context)
        return serializer.data


class MessageSerializer(serializers.ModelSerializer):
    message_id = serializers.SerializerMethodField()
    sender_user_id = serializers.SerializerMethodField()
    sender_user_fullname = serializers.SerializerMethodField()
    sender_user_email = serializers.SerializerMethodField()
    read = serializers.SerializerMethodField()
    attachments = serializers.SerializerMethodField()

    responses = RecursiveField(many=True)

    class Meta:
        model = Message
        fields = [
            'message_id', 'sender_user_id', 'sender_user_fullname', 'subject', 'body', 'created_at', 'read', 'read_at', 'attachments', 'responses'
        ]

Мой нынешний результат выглядит так:

{
    "results": [
        {
            "message_id": 115,
            "sender_user_id": 1,
            "sender_user_fullname": "user1",
            "subject": "Temat",
            "body": "<p>Wiadomość</p>",
            "created_at": "2019-09-28T19:33:40.846822Z",
            "read": true,
            "read_at": "2019-09-28T19:35:58.889000Z",
            "attachments": {},
            "responses": [
                {
                    "message_id": 116,
                    "sender_user_id": 1,
                    "sender_user_fullname": "user1",
                    "subject": "Re: Temat",
                    "body": "<p>Odpowiedź</p>",
                    "created_at": "2019-09-28T19:35:52.485656Z",
                    "read": true,
                    "read_at": "2019-09-28T19:36:21.932000Z",
                    "attachments": {},
                    "responses": [
                        {
                            "message_id": 117,
                            "sender_user_id": 1,
                            "sender_user_fullname": "user1",
                            "subject": "Re: Re: Temat",
                            "body": "<p>Odpowiedź do odpowiedzi</p>",
                            "created_at": "2019-09-28T19:36:20.717966Z",
                            "read": true,
                            "read_at": "2019-09-28T19:36:20.714495Z",
                            "attachments": {},
                            "responses": [],
                        }
                    ]
                }
            ]
        }
    ]
}

Я бы хотел вот так:

{
    "results": [
        {
            "message_id": 115,
            "sender_user_id": 1,
            "sender_user_fullname": "user1",
            "subject": "Temat",
            "body": "<p>Wiadomość</p>",
            "created_at": "2019-09-28T19:33:40.846822Z",
            "read": true,
            "read_at": "2019-09-28T19:35:58.889000Z",
            "attachments": {},
            "responses": [
                {
                    "message_id": 116,
                    "sender_user_id": 1,
                    "sender_user_fullname": "user1",
                    "subject": "Re: Temat",
                    "body": "<p>Odpowiedź</p>",
                    "created_at": "2019-09-28T19:35:52.485656Z",
                    "read": true,
                    "read_at": "2019-09-28T19:36:21.932000Z",
                    "attachments": {},
                    "responses": []
                },
                {
                    "message_id": 117,
                    "sender_user_id": 1,
                    "sender_user_fullname": "user1",
                    "subject": "Re: Re: Temat",
                    "body": "<p>Odpowiedź do odpowiedzi</p>",
                    "created_at": "2019-09-28T19:36:20.717966Z",
                    "read": true,
                    "read_at": "2019-09-28T19:36:20.714495Z",
                    "attachments": {},
                    "responses": []
                }
            ]
        }
    ]
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...