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 > 20. Авторы вышли из ситуации и использовали именованные аргументы с такими необычными именами.</p>
18
<p>Такой синтаксис приходится использовать, так как мы не можем при вызове метода указать аргумент id > 20. Авторы вышли из ситуации и использовали именованные аргументы с такими необычными именами.</p>
19
<p>Попробуем запросить данные из базы данных и вывести список всех записей модели Article:</p>
19
<p>Попробуем запросить данные из базы данных и вывести список всех записей модели Article:</p>
20
<p>И последнее, что можно сделать с сущностью, это удалить ее:</p>
20
<p>И последнее, что можно сделать с сущностью, это удалить ее:</p>
21
21