Вопрос Django ORM о методах для объекта QuerySet
Может кто-нибудь объяснить мне, почему можно использовать метод типа count() для объекта QuerySet, но что-то вроде pop() не работает.
Причина в том, что, в отличие от списка, QuerySet - это особый тип, который не оценивается, пока вы не выполните какие-либо вычисления над его данными. Его назначение - хранить результаты запросов, которыми можно манипулировать с помощью таких методов запросов, как .filter()
, .order_by()
и т.д. В отличие от списка объектов, который занимает место в оперативной памяти, QuerySet не будет делать так много. Поэтому он не поддерживает методы списка, такие как remove
или pop
и т.д., которые выполняют манипуляции.
Набор QuerySet - это представление запроса к базе данных. Он производит набор экземпляров модели из базы данных. count() работает, потому что это операция базы данных: подсчет строк, соответствующих запросу. Однако функция pop() требует удаления элемента из этого набора. Но этот набор существует только в памяти, как представление состояния базы данных. Изменение его в памяти не приведет к изменению базы данных - поэтому pop() не имеет смысла для QuerySet. Вы бы использовали QuerySet[index] для получения определенного элемента, а затем ModelInstance.delete() для удаления этого экземпляра из базы данных. Другими словами: QuerySet - это представление данных базы данных только для чтения. Это не полностью изменяемая коллекция, подобная списку.