Вложенная сериализация 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 выражения для получения желаемого формата вывода, однако я бы настоятельно рекомендовал вам использовать сериализатор для этого, ссылка

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