HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Модель в MVC v2 - это слой приложения, который отвечает за связь с предметной областью. В нем находится вся бизнес-логика приложения. Для простоты реализации, сюда часто включают механизмы для работы с базой данных.</p>
1 <p>Модель в MVC v2 - это слой приложения, который отвечает за связь с предметной областью. В нем находится вся бизнес-логика приложения. Для простоты реализации, сюда часто включают механизмы для работы с базой данных.</p>
2 <p>Модель, как слой, существует независимо от фреймворка, HTTP и веба в целом. Вся остальная система может обращаться к моделям, но модели не могут знать и не знают ничего про среду, в которой они выполняются.</p>
2 <p>Модель, как слой, существует независимо от фреймворка, HTTP и веба в целом. Вся остальная система может обращаться к моделям, но модели не могут знать и не знают ничего про среду, в которой они выполняются.</p>
3 <p>Это значит, что мы можем работать с моделями через специальный вариант REPL, который работает в контексте фреймворка командой uv run manage.py shell.</p>
3 <p>Это значит, что мы можем работать с моделями через специальный вариант REPL, который работает в контексте фреймворка командой uv run manage.py shell.</p>
4 <p>Создадим новую статью, наполним ее данными и сохраним в базе:</p>
4 <p>Создадим новую статью, наполним ее данными и сохраним в базе:</p>
5 <p>Инстанцирование объекта лишь создает его в памяти. Чтобы сохранить объект в базе, нужно применить метод save().</p>
5 <p>Инстанцирование объекта лишь создает его в памяти. Чтобы сохранить объект в базе, нужно применить метод save().</p>
6 <p>Также можно создать объект методом create(). Этот метод создает объект и автоматически сохраняет его в базу.</p>
6 <p>Также можно создать объект методом create(). Этот метод создает объект и автоматически сохраняет его в базу.</p>
7 <p>Этот метод делает запрос<em>INSERT</em>в базу данных. Затем он обновляет сам объект:</p>
7 <p>Этот метод делает запрос<em>INSERT</em>в базу данных. Затем он обновляет сам объект:</p>
8 <ul><li>Внутрь записывается идентификатор статьи, взятый из базы данных.</li>
8 <ul><li>Внутрь записывается идентификатор статьи, взятый из базы данных.</li>
9 <li>Заполняются поля<em>created_at</em>и<em>updated_at</em>.</li>
9 <li>Заполняются поля<em>created_at</em>и<em>updated_at</em>.</li>
10 </ul><p>Созданный объект можно тут же поменять:</p>
10 </ul><p>Созданный объект можно тут же поменять:</p>
11 <p>Изменение свойств не затрагивает базу данных. Это происходит только на уровне самого объекта. Если в этот момент закрыть консоль, то все изменения потеряются. Для сохранения нужно снова вызвать save(). Этот метод универсальный, он подходит как для создания новой сущности, так и для ее обновления:</p>
11 <p>Изменение свойств не затрагивает базу данных. Это происходит только на уровне самого объекта. Если в этот момент закрыть консоль, то все изменения потеряются. Для сохранения нужно снова вызвать save(). Этот метод универсальный, он подходит как для создания новой сущности, так и для ее обновления:</p>
12 <p>Теперь предположим, что у нас нет переменной с текущей статьей. Например, мы перезапустили консоль. Получить нужный объект можно с помощью статических методов, которые появляются у каждой модели. Самый простой способ достать запись, сделать поиск по ее идентификатору:</p>
12 <p>Теперь предположим, что у нас нет переменной с текущей статьей. Например, мы перезапустили консоль. Получить нужный объект можно с помощью статических методов, которые появляются у каждой модели. Самый простой способ достать запись, сделать поиск по ее идентификатору:</p>
13 <p>Article.objects - это представление всех объектов данной модели.<em>get</em>ищет одну запись по заданному условию и возвращает запись. Если запись не найдена, то вызовется исключение:</p>
13 <p>Article.objects - это представление всех объектов данной модели.<em>get</em>ищет одну запись по заданному условию и возвращает запись. Если запись не найдена, то вызовется исключение:</p>
14 <p>Если нужен поиск по полям, который вернет коллекцию, для этого подходит метод<em>filter</em>:</p>
14 <p>Если нужен поиск по полям, который вернет коллекцию, для этого подходит метод<em>filter</em>:</p>
15 <p>Мы можем составить и более сложный запрос. Предположим, что надо вывести body первой записи, у которой это id больше 50 (при условии, что записей в таблице больше 50):</p>
15 <p>Мы можем составить и более сложный запрос. Предположим, что надо вывести body первой записи, у которой это id больше 50 (при условии, что записей в таблице больше 50):</p>
16 <p>Здесь строится целая цепочка вызова методов. И такие цепочки могут быть достаточно длинными. Каждый из шагов уточняет запрос по тому или иному критерию, а в конце всегда стоит вызов какого-то метода. Он определяет, сколько записей мы хотим получить. В данном случае мы хотим получить одну первую попавшуюся. Поэтому запрос заканчивается вызовом метода .first(). А .body мы уже получаем у объекта, который является результатом выполнения запроса.</p>
16 <p>Здесь строится целая цепочка вызова методов. И такие цепочки могут быть достаточно длинными. Каждый из шагов уточняет запрос по тому или иному критерию, а в конце всегда стоит вызов какого-то метода. Он определяет, сколько записей мы хотим получить. В данном случае мы хотим получить одну первую попавшуюся. Поэтому запрос заканчивается вызовом метода .first(). А .body мы уже получаем у объекта, который является результатом выполнения запроса.</p>
17 <p>Во фрагменте указано условие, по которому выбираются объекты в запросе - id__gt=50. Это так называемый<em>lookup</em>.<em>id</em>здесь означает имя поля, а дальше через разделитель "__" (двойное подчеркивание) указывается<em>gt</em>- сокращение от<em>greater than</em>(больше чем) и, наконец, само значение.</p>
17 <p>Во фрагменте указано условие, по которому выбираются объекты в запросе - id__gt=50. Это так называемый<em>lookup</em>.<em>id</em>здесь означает имя поля, а дальше через разделитель "__" (двойное подчеркивание) указывается<em>gt</em>- сокращение от<em>greater than</em>(больше чем) и, наконец, само значение.</p>
18 <p>Такой синтаксис приходится использовать, так как мы не можем при вызове метода указать аргумент id &gt; 20. Авторы вышли из ситуации и использовали именованные аргументы с такими необычными именами.</p>
18 <p>Такой синтаксис приходится использовать, так как мы не можем при вызове метода указать аргумент id &gt; 20. Авторы вышли из ситуации и использовали именованные аргументы с такими необычными именами.</p>
19 <p>Попробуем запросить данные из базы данных и вывести список всех записей модели Article:</p>
19 <p>Попробуем запросить данные из базы данных и вывести список всех записей модели Article:</p>
20 <p>И последнее, что можно сделать с сущностью, это удалить ее:</p>
20 <p>И последнее, что можно сделать с сущностью, это удалить ее:</p>
21  
21