Проблема с методом .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 с другим сериализатором для сериализации ваших связанных полей.