У меня проблема с вложенными самоссылающимися объектами.У меня есть поле 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": []
}
]
}
]
}