Проблема с методом .only(), передаваемым в Pagination / Serialization --- возвращаются все поля, а не те, которые указаны в only()

Я пытаюсь загрузить некоторые данные в таблицы данных. Я пытаюсь указать столбцы в запросе model.objects с помощью .only() --- на первый взгляд результирующий QuerySet выглядит так, как будто запрос mySQL запрашивает только эти столбцы

Однако, когда я пытаюсь передать QuerySet в Paginator и/или Serializer, результат содержит ВСЕ колонки.

Я не могу использовать .values_list(), потому что он не возвращает вложенные объекты, которые мне нужно сериализовать как часть моего конкретного запроса столбца. Я не уверен, что происходит с моим .only()

db_result_object = model.objects.prefetch_related().filter(qs).order_by(asc+sort_by).only(*columns_to_return)

    paginated_results = Paginator(db_result_object,results_per_page)
    serialized_results = serializer(paginated_results.object_list,many=True)
    paginated_results.object_list = serialized_results.data

    return paginated_results

Этот вопрос тоже поставил меня в тупик. В Django вызов only() не возвращает данные, эквивалентные SQL-оператору, подобному этому:

SELECT col_to_return_1, ... col_to_return_n
FROM appname_model

Причина, по которой он не делает этого так, заключается в том, что Django возвращает вам данные не тогда, когда вы создаете QuerySet, а когда вы впервые обращаетесь к данным из этого QuerySet ( см. lazy QuerySets).

В случае only() (конкретный пример того, что называется отложенным полем) вы по-прежнему получаете все поля, как обычно, но разница в том, что они не полностью загружаются из базы данных сразу. Когда вы обращаетесь к данным, загружаются только те поля, которые включены в единственное утверждение. Некоторые полезные документы здесь.

Моей рекомендацией было бы написать ваш сериализатор так, чтобы он заботился только об одном конкретном файле, вероятно, используя SerializerMethodField с другим сериализатором для сериализации ваших связанных полей.

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