Step 5 (S-44795)
Step on Stepik: https://stepik.org/lesson/14829/step/5
[00:00 - 00:17] следующая важная функция которая предоставляется джанго моделями это связей между моделями а связи соответствуют связей между таблицами базы данных как мы говорили а
[00:17 - 00:36] в базах данных есть внешние ключи но это не обязательно внешней ключи от ограничений а связей между таблицами могут существовать и без внешних ключей то есть связь это чисто логическое соотношение когда в 1 таблице делайте ссылку на строчки из другой таблицы
[00:36 - 00:51] а как связей между моделями задаются в языке а в разборке джанго итак рассмотрим продолжение продолжение нашей модели post
[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] эта опция которая показывает что делать с постом при удалении категории но эта опция полностью отражает функционал внешних ключей которые существуют в базе данных давать сразу поговорим про это
[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] это используется не очень часто потому что в приложениях объект редко удаляются не чаще помечаются как удаленные записать на флешку на всякий случай оставлю итак а эта форма позволяет задать связь
[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 вот эту модель переместить в базу данных какую структуру таблиц она превратится а итак вот таблица соответствующее нашей основной модель это таблица с постом
[07:16 - 07:36] обратите внимание на название название таблице blog подчеркивание post предполагается что вся наша модель они находятся а приложение в django приложение с именем блог а мы помним что
[07:36 - 07:50] поставь есть поле тигре усмотреть называется просто категория которая является внешним ключом на объект категории
[07:50 - 08:09] модель категории а в базе для этого заводится фотки а причем в таблице появляется поле кати грязи не категориях категории 1 с подчеркивание в нем хранится айтишник категория из таблицы категорий
[08:09 - 08:28] все просто а в случае с связью 1 к 1 мы назвали поле статус у нас в базе появилось поле статус 1
[08:28 - 08:44] которая является внешним ключом а таблицу статусов но при этом на поле еще добавился уникальный индекс то есть в нас не получится создать 2
[08:44 - 09:01] 2 записи в таблице блок который ссылались про 1 статус то есть one to one field это foreign key + ограничение уникальный индекс далее самое интересное это many to many fields мы назвали
[09:01 - 09:19] поле текст то есть поле text эта связь многие ко многим но в таблице блога ничего не появилось то есть связь многие ко многим а в джанге в соответствие с хорошими проектирование сделана через
[09:19 - 09:38] отдельную таблицу джанго создает отдельную таблицу для которой нет а модели соответствующая ей а в этой таблице она называется по названию модели которая на связывают смотрите нас модели называются
[09:38 - 09:55] post и тег не связано многие ко многим соответственно создается таблица post tags а и внутри нее 2 а поле которое оно ссылается
[09:55 - 10:12] на посты другой ссылается на теги а таким образом все наше соотношение между моделями будут представлены в базе данных
[10:12 - 10:26] еще раз если это поле foreign key то оно с отвесом представляется в виде фотки если это want one field 1 к 1 то это foreign key и +
[10:26 - 10:42] уникальный индекс то есть ограничение уникальности на поле если это many to many fields то создается новая промежуточная таблица а это так выглядит в базе каким образом
[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] в этом примере