Step 5 (S-44795)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14829/step/5

Step 5 (S-44795) 1.png

[00:00 - 00:17] следующая важная функция которая предоставляется джанго моделями это связей между моделями а связи соответствуют связей между таблицами базы данных как мы говорили а


[00:17 - 00:36] в базах данных есть внешние ключи но это не обязательно внешней ключи от ограничений а связей между таблицами могут существовать и без внешних ключей то есть связь это чисто логическое соотношение когда в 1 таблице делайте ссылку на строчки из другой таблицы


[00:36 - 00:51] а как связей между моделями задаются в языке а в разборке джанго итак рассмотрим продолжение продолжение нашей модели post


Step 5 (S-44795) 2.png

[00:51 - 01:08] это класс создается непосредственно поля которые будут соответствовать таблицам boot них содержаться значение а потом мы задаем 3 поля специального вида которые являются связи


[01:08 - 01:24] а связи в django model создаются в виде специального типа foreign key to one field и many to many feel


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


[01:40 - 01:56] короче говоря если мы создаем игоря а виде foreign key мы указываем модель на которую ссылаетесь вот


[01:56 - 02:11] здесь в этом описании категории это имя класса то есть предполагается что у вас есть класс post и где то выше по коду есть ласка тигре а мы его импортировали


[02:11 - 02:27] если я в этот класс вообще в другом модуле лежит если он а лежит в данном модуле его импортировать не нужно


[02:27 - 02:45] импортировали этот класс а и ссылаешься на него с помощью модели мы также создаем различные опции например


[02:45 - 03:01] ну равняется означает что данная ссылка то есть данное поле может быть пустым поста может быть из категории а специальная опция он велит а удалить


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


Step 5 (S-44795) 3.png

[03:16 - 03:32] в базах данных при задание указания а внешних ключей то есть foreign keys а позволяет задать 1 из 4 опции что нужно делать при удалении строчки на которую вы ссылаетесь


[03:32 - 03:51] то есть данном случае нас есть post которая ссылается на какую то категорию он принадлежит к категории что делать когда эта категория удаляет есть 4 варианта restrict restrict означает что база данных отклонит удаления от астана сообщить об ошибке что нельзя удалять


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


[04:10 - 04:25] в начале что у пастора просто в мес авто в то место где ставится ссылка на базу данных а будет проставлена ну значение то есть post не будет ссылаться на какую категорию


[04:25 - 04:43] авто месяц посылаются на вот на удаляемого категории а ну и частности ноет что он не предпринимать ничего оставить все на откуп базе данных


[04:43 - 04:58] джанго вот эти все мои все опции называются несколько по другому например restrict называется проект снова называется вот таким вот образом что называется


[04:58 - 05:16] это используется не очень часто потому что в приложениях объект редко удаляются не чаще помечаются как удаленные записать на флешку на всякий случай оставлю итак а эта форма позволяет задать связь


Step 5 (S-44795) 4.png

[05:16 - 05:35] а 1 ко многим то есть 1 категории соответствует множество постов а далее в некоторых случаях необходимо задать связь 1 к 1 представим что каким то причинам мы для каждого поста создаем отдельный объект в котором хранится его статистика


[05:35 - 05:51] статистика этого поста количество показов а еще что то а возможно для каждого поста существует ровно 1 черновик таком случае а связь у нас в базе данных 1 к 1


[05:51 - 06:06] 1 к 1 из дел а если foreign key эта связь многие к 1 то есть 1 категория множество постов то want one связь 1 к 1 а


[06:06 - 06:23] здесь все примерно так же как forum кем то есть создается новое поле указывается модель с которой мы связаны и готово а в некоторых случаях связь вида многие ко многим например


[06:23 - 06:42] связь между постами и темами у каждого тэга может быть у каждого поста может быть там 2 3 4 tech но ты этого тэга может быть множество постов а в таком случае заводится специальное поле many to many fields


[06:42 - 06:59] указывается модель с которой мы связано а теперь давайте посмотрим как вот такая структура в языке python будет представлен в базе данных


[06:59 - 07:16] то есть когда jungle вот эту модель переместить в базу данных какую структуру таблиц она превратится а итак вот таблица соответствующее нашей основной модель это таблица с постом


Step 5 (S-44795) 5.png

[07:16 - 07:36] обратите внимание на название название таблице blog подчеркивание post предполагается что вся наша модель они находятся а приложение в django приложение с именем блог а мы помним что


[07:36 - 07:50] поставь есть поле тигре усмотреть называется просто категория которая является внешним ключом на объект категории


Step 5 (S-44795) 6.png

Step 5 (S-44795) 7.png

[07:50 - 08:09] модель категории а в базе для этого заводится фотки а причем в таблице появляется поле кати грязи не категориях категории 1 с подчеркивание в нем хранится айтишник категория из таблицы категорий


[08:09 - 08:28] все просто а в случае с связью 1 к 1 мы назвали поле статус у нас в базе появилось поле статус 1


Step 5 (S-44795) 8.png

Step 5 (S-44795) 9.png

[08:28 - 08:44] которая является внешним ключом а таблицу статусов но при этом на поле еще добавился уникальный индекс то есть в нас не получится создать 2


[08:44 - 09:01] 2 записи в таблице блок который ссылались про 1 статус то есть one to one field это foreign key + ограничение уникальный индекс далее самое интересное это many to many fields мы назвали


Step 5 (S-44795) 10.png

[09:01 - 09:19] поле текст то есть поле text эта связь многие ко многим но в таблице блога ничего не появилось то есть связь многие ко многим а в джанге в соответствие с хорошими проектирование сделана через


Step 5 (S-44795) 11.png

[09:19 - 09:38] отдельную таблицу джанго создает отдельную таблицу для которой нет а модели соответствующая ей а в этой таблице она называется по названию модели которая на связывают смотрите нас модели называются


Step 5 (S-44795) 12.png

[09:38 - 09:55] post и тег не связано многие ко многим соответственно создается таблица post tags а и внутри нее 2 а поле которое оно ссылается


Step 5 (S-44795) 13.png

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


[10:12 - 10:26] еще раз если это поле foreign key то оно с отвесом представляется в виде фотки если это want one field 1 к 1 то это foreign key и +


Step 5 (S-44795) 14.png

[10:26 - 10:42] уникальный индекс то есть ограничение уникальности на поле если это many to many fields то создается новая промежуточная таблица а это так выглядит в базе каким образом


Step 5 (S-44795) 15.png

[10:42 - 11:00] отношения можно использовать а в коде на языке python давайте пройдемся по этому примеру здесь просто приведены некоторые вызова начнем с того что мы загружаем некоторый объект post


[11:00 - 11:15] загружая просто 1 post из базы да а если мы обращаемся к свойству категория объекта а вы получали


[11:15 - 11:30] сразу получаю объект модель категории то есть результат это будет не айдишник то есть не число которых хранится в базе сразу модель сразу объект


[11:30 - 11:45] это удобно для того чтобы переходить по связям например когда вы отображается на странице поста вы хотите сразу показать его категорию и не просто число название сколько там


[11:45 - 12:02] а постов в этой категории например а что делать если вы хотите получить не саму категорию а именно ее номер в таком случае вы обращаетесь к свойству категория d


[12:02 - 12:19] заметьте что это за свойство в первоначальной модели не было то есть начальные модели мы опишем только свойства джанго models генерирует автоматически такие свойства а для того чтобы вы могли получить


[12:19 - 12:39] то есть смотреть когда вы обращаетесь к свойству потому имени которое указано в модели вы работаете с объектами когда вы обращаетесь к свойству потому имени которое сохранено в базе вы работаете с сырыми данными так это у нас


[12:39 - 12:54] использование foreign key а использование отличается то же самое обращайтесь по названию поле получайте статус обращайтесь по названию поле


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


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


[13:28 - 13:46] в данном случае тегов связанных с конкретным данным постом например вы можете вызвать у этого объекта метод пол ну в полном виде того так сначала получаем обед потом за вами я тут пол а результат такого выдал вызова вернет вам


[13:46 - 14:02] массив массив объектов тегов а помимо того что вы получаете список всех тегов а вы можете с помощью этот менеджера делать некоторые другие вещи например добавлять


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


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


[14:33 - 14:51] а связанно с помощью фотки с моделью категория модели категории появятся специальные мед post set это тоже а но метод percent свойств оно возвращает тоже related менеджеров


[14:51 - 15:10] это множество всех а всех постов связанных с данной категории ну и вызвав у него этот all вы можете получить список этих постов 20 а может быть большой а также для тегов для тэга на модели тэга явно создается свойства post set


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


[15:26 - 15:43] джанго models задание структуры таблиц а еще раз повторимся а каждая таблица соответствует отдельному классу а джанго models в этом классе


[15:43 - 16:00] задаются поля с помощью создания объектов а например char филдз либо других типов полей и между моделями создаются соотношение с помощью специальных типов полей foreign key


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


[16:19 - 16:20] в этом примере