Вложенная сериализация DRF без необработанного sql-запроса
Я столкнулся с этой проблемой уже несколько дней назад. Пробовал разные подходы, но безуспешно. У меня есть два класса - Poll и PollAnswer. Вот они:
class Poll(Model):
title = CharField(max_length=256)
class PollAnswer(Model):
user_id = CharField(max_length=10)
poll = ForeignKey(Poll, on_delete=CASCADE)
text = CharField(max_length=256)
как правильно получить список опросов, в которых есть ответы с used_id равным определенной строке с вложенным списком ответов этого пользователя? примерно так:
{
'poll_id': 1,
'answers' : {
'user1_answer1: 'answer_text1',
'user1_answer2: 'answer_text2',
'user1_answer3: 'answer_text3',
},
}
и если это простой вопрос, то мне, вероятно, нужны хорошие руководства по django orm.
первым делом я попытался сделать метод сериализатора (унаследованный от drf's ModelSerializer), но получил ошибку, что этот класс не может иметь такого метода. после этого я попытался использовать поле сериализатора с ForeignKey, но вместо этого получил опросы, вложенные в ответы. сейчас я думаю, что могу сделать Polls.objects.raw('some_sql_query'), но это, вероятно, не лучший способ.
Ваша проблема описана в документации (также лучшая практика). Вы можете использовать вложенный сериализатор:
https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
Иначе, если вы хотите сохранить вложенные ответы, как вы описали: я бы использовал метод сериализатора field
https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
затем сделайте небольшой цикл над вашими ответами ... и верните любой формат, который вы хотите.
Вам нужно взглянуть на этот раздел, если вам действительно нужно сделать это таким образом, в основном вам нужно использовать F выражения для получения желаемого формата вывода, однако я бы настоятельно рекомендовал вам использовать сериализатор для этого, ссылка