Step 2 (S-44799)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14830/step/2

Step 2 (S-44799) 1.png

[00:00 - 00:14] на прошлом семинаре мы обсудили как с помощью django models спроектировать базу данных как описать вашу модель данных а с помощью класс закипать


[00:14 - 00:30] ну и немного начали рассматривать api который представляет джанго models частности а загрузка связанных объектов с помощью простого обращение к свойству свойство которое является полем отношения между моделями


[00:30 - 00:47] а сейчас давайте более подробно рассмотрим api который представляется django models а потому что общем то большая часть кода в приложении на джанге она плотно взаимодействуют именно и модели


Step 2 (S-44799) 2.png

[00:47 - 01:03] начнем с того как создавать и изменять отдельные записи отдельные объекты а поставь нас какой то код на находится допустим of view


[01:03 - 01:19] хотя это не очень рекомендованная практикой мы говорили про то что во вью много кода писать не нужно либо в каком то другом месте и мы хотим создать объект а модели post нам нужно сделать


[01:19 - 01:36] импортировать необходимую модели с которыми мы будем работать из модуля models а создания создание объекта модели происходит естественным да языка python образом это просто создание объектов


[01:36 - 01:54] то есть а модель это класс соответственно чтобы создать экземпляр модели вы создаете новый объект а при этом в конструктор класс вы придаете значение всех необходимых вам полей например можете создать категорию с заголовком


[01:54 - 02:09] в данный момент модель еще не находятся в базе данных это просто объект который размещен в памяти если вызвать модель она будет сохранена базу данных


[02:09 - 02:27] в этот момент модели появятся свойства пикей prime реки либо с айди до момента сохранения этих свойств модели не было итак


[02:27 - 02:42] модель можно создать просто создав экземпляр класса и вызвал именно способ создать за 1 строчку использовать вот такую конструкцию


[02:42 - 02:59] а мы видим что здесь используется специальное свойство называемый он же свойством они описывали когда проектировали модель это свойство генерируется джанго models автоматически это называется общих менеджеров


[02:59 - 03:14] попозже важно что менеджера есть метод create которая позволяет создавать экземпляр модели созданы таким образом сразу помещается в базу данных


[03:14 - 03:30] соответственно мне сразу есть а первичный ключ изменение модели а происходит также естественном для языка python а способом вы просто присваиваете новое значение поля


[03:30 - 03:46] например выше мы создали категорию назвали ее python он решили изменить название назвали бал и опять называется метод save в данном случае метод save выполнять


[03:46 - 04:04] операцию апдейт по обновлению данных в таблице итак таким образом создаются скажем простые модели которых нет связи ну модели категории связи не было то есть это была просто запись в базе


[04:04 - 04:20] состоящая из вентилятора и назвать а вот у модели post у нее есть связи есть множество связи с разными таблице таким образом создавать такие модели а это зависит от


[04:20 - 04:35] могут ли связи быть пустым если все связи помечено как то есть они могут быть пустыми то создания ничем не отличается а если связи допустим не мог пустыми например а


[04:35 - 04:54] поставь есть обязательная связь с категорией таком случае вам необходимо иметь какой то объект категории заранее вот в этой строчке мы создаем новую категорию сохраняем ее в базу а после этого переменная ц содержит объект модели категория


[04:54 - 05:09] дальше при создании поста мы создаем его точно также но указываем значение свойства 5 игорь а причем заметьте мы указываем имя игоря


[05:09 - 05:24] то есть то свойство которое нас описана модель а во 2 мы передаем ей объект то есть когда мы оперируем а мы а стараясь оперировать объектами ане идентификаторами


[05:24 - 05:42] после того как мы создали модель post вот на современных п мы делаем save и модель сохраняется в базу а был вариант 2


[05:42 - 05:57] вот здесь мы указываем игоря то есть мы устанавливаем категорию и мне ссылку на ну и не сам объект категории а можно было вместо кати категории указать идентификатор


[05:57 - 06:15] тогда следовало написать категория id равняется 3 сказать такой вариант тоже бы сработал как дело обстоит со связями многие ко многим


[06:15 - 06:30] для связи многие ко многим вам нужно иметь массив объектов даже если это массив из 1 элемента а здесь посту присваиваем


[06:30 - 06:48] а в переменную в свойство text присваиваем список состоящий из 3 тегов а вот эта конструкция выбирают 3 тэга а скажем 3/1 тэга из базы данных сразу целый массив после чего сохраняем


[06:48 - 07:07] в результате а сама модель сама таблица post запись таблицы post не изменится но в промежуточной таблицы появятся 3 новой строчки а мы говорили что


[07:07 - 07:24] текс вот это свойство оно является объектом специального вида а related менеджеров а завтра этот менеджер поддерживает разные методы помимо того что можно получить связанные объекты можно например добавить


[07:24 - 07:39] например вызов метода n дд можно добавить 1 тег а к списку связанных с постом в любом случае потом а пост нужно сохранить а то есть


[07:39 - 07:54] создание объектов с какими то связями оно в принципе не сильно отличается от создания объектов без связи только нужно учитывать что мы либо указываем полное и передаем


[07:54 - 08:12] объект связаны либо нужно указывать а поля из базы данных тогда передавать сидеть перейдем к следующему шагу посмотрим как получить объект из базы данных при получение объекта


Step 2 (S-44799) 3.png

[08:12 - 08:30] а необходимо обратиться к менеджеру а смотрите допустим мы хотим загрузить объект модель post таком случае у post


[08:30 - 08:49] а это а менеджер связанной а работал менеджером снять с него model менеджер менеджер связаны с моделью post мы вызываем метод метод get мы передаем а условия а


[08:49 - 09:07] у которого фильтрую в принципе сюда можно передавать любые условия в данном случае мы загружаем а объект по личному ключу то есть по идентификатору а в результате мы получим экземпляр модели post


[09:07 - 09:25] требуемая объект что может произойти при таком запросе а но помимо технических ошибок соединенным с базой самое очевидно что может произойти а поставь таким идентификатором может не оказаться в таком случае будет выброшено исключение does not exist


[09:25 - 09:45] мы можем перехватить это исключение с помощью инструкции accept конструкции accept языке python и как то обработать а причем заметьте что это исключение это не какой то глобальной класс так вот в пайтоне есть эльвира котя а это исключение


[09:45 - 10:02] находится внутри класса post то есть у каждой модели создается свой собственный класс исключения должно таксист таким образом мы можем точно знать какая модель когда у нас возникла это исключение может перехватывать отдельности


[10:02 - 10:21] исключение а вот таким должен делать загрузка по первичному ключу а как я говорил можно указывать и другие условия например загрузка по имени но по другому полю а


[10:21 - 10:38] какая здесь может быть ситуация здесь заключаться в том что по данному условию из базы выбрано более 1 объекта метод get он все таки он а предназначен для загрузки ровно 1 объекта если


[10:38 - 10:57] по условию на python неожиданно появится 2 объекта будет специально брошено специально исключением тестовая может обработать что то сделать а вообще это ситуация нетипичная то есть когда вы загружаете


[10:57 - 11:16] что то с помощью метода get а вы должны либо использует первичный ключ либо какое то поле по которому есть уникальный индекс то есть по полю name желательно иметь уникальный а но в принципе этой ситуации остается на усмотрение программиста


[11:16 - 11:34] как поступить когда мы хотим выбрать несколько объектов из базы а в этом случае мы также используем то есть вы можете выбрать несколько постов мы используем model менеджеров


Step 2 (S-44799) 4.png

[11:34 - 11:50] post options и у этого мода у менеджера а необходимо вызывать методы которые покажут каким образом фильтровать а фильтровать таблицу то есть


[11:50 - 12:09] пример 1 строчка метод говорит что фильтровать не нужно нужно выбрать все посты model менеджера есть метод а каким образом ограничить выдачу то есть мы хотим выбрать не все посты только там


[12:09 - 12:26] 10 результат вызова all а представляет собой мы поговорим о нем позже то есть когда мы взываем никакого запроса еще не происходит на самом деле а мы получаем а


[12:26 - 12:42] этот объект он поддерживает слайсинг то есть а в нем есть специальные методы так чтобы он мог индексировать данный объект в частности если мы используем вот такой slice


[12:42 - 13:01] то есть 1 3 элемента произойдет запрос в базу и нам вернуться 1 3 элемента данного запроса а окей это была выборка без фильтрации допустим мы хотим выбрать все посты которые


[13:01 - 13:17] соответствуют данной категории таком случае мы сначала загружается категорию известным нам уже образом а далее пытаемся загрузить посты но вместо метода метод фильтр


[13:17 - 13:35] метод фильтр говорит о том что выборку нужно отфильтровать по указанному условию условия такое что игорь соответствует данной категории причем заметил мы здесь опишем выражение в терминах объектов


[13:35 - 13:53] при запросе в базу конечно это будет переведено категория d равняется ц 1 вот в такую формулировку то есть при запросе в базу там будет поставлен естественно идентификатор объекта


[13:53 - 14:08] мы тем не менее вызывая а метод фильтр с указанием славу объекта мы получаем post python post как я уже говорила такой сет


[14:08 - 14:23] коля ты еще не выполненный запрос а мы можем его фильтровать разными способами давайте рассмотрим следующий пример более сложное а мы фильтруем по наличию в заголовке


[14:23 - 14:43] title слово сс мы видим что условия на фильтрацию оформлен довольно странным образом мы указали наши поля через двойное подчеркивание способ фильтрации а это именно так то есть


[14:43 - 15:00] если мы указываем поле равно то фильтрация по точному совпадению если мы указываем какую то суффикса это позволяет нам использовать разные операторы связи например а поиск по содержимому мы а в результате фильтрации получаем ответку reset


[15:00 - 15:16] у колесов другое этот ордер бай бай позволяет сделать сортировку данном запросе на запрос от этого не происходит и в конце концов мы делаем слайсинг то есть получаем


[15:16 - 15:33] конкретно 10 элементов происходит запрос а вот так загружаются загружается несколько объектов из базы то есть фактически здесь речь идет про то как составить оператор селект


[15:33 - 15:46] то есть я так рад расселяет а джанго models джанго models это вызовы вот у менеджера для данной модели