- Как вывести модели django
- Добавление данных
- create
- Получение из бд
- Получение одного объекта
- filter()
- exclude()
- in_bulk()
- Обновление
- update()
- update_or_create()
- Удаление
- Просмотр строки запроса
- Модели Django
- Модели
- Пример
- Поля модели
- Как установить первичный ключ?
- Как добавить эту модель в базу данных?
- CRUD операции
- Как отфильтровать больше и меньше?
- Внешние ключи
- through
- Модели Django
- Объекты
- Модель в Django
- Создание приложения
- Создание модели записи в блоге
- Создаём таблицы моделей в базе данных
Как вывести модели django
При создании моделей они наследуют поведение от класса django.db.models.Model , который предоставляет ряд базовых операций с данными.
Рассмотрим ряд операций на примере модели Person :
Добавление данных
create
Для добавления данных применяется метод create() :
Если добавление пройдет успешно, то объект будет иметь id, который можно получить через tom.id .
Однако в своей сути метод create() использует другой метод — save() , который мы также можем использовать отдельно для добавления объекта:
После успешного добавления также можно получить идентификатор добавленной записи с помощью tom.id .
Получение из бд
Получение одного объекта
Метод get() возвращает один объект по определенному условию, которое передается в качестве параметра:
При использовании этого метода надо учитывать, что он предназначен для выборки таких объектов, которые имеются в единичном числе в базе данных. Если в таблице не окажется подобного объекта, то мы получим ошибку имя_модели.DoesNotExist . Если же в таблице будет несколько объектов, которые соответствуют условию, то будет сгенерированно исключение MultipleObjectsReturned . Поэтому следует применять данный метод с осторожностью.
Метод get_or_create() возвращает объект, а если его нет в бд, то добавляет в бд новый объект.
Метод возвращает добавленный объект (в данном случае переменная bob) и булевое значение (created), которое хранит True, если добавление прошло успешно.
Если необходимо получить все имеющиеся объекты, то применяется метод all() :
filter()
Если надо получить все объекты, которые соответствуют определенному критерию, то применяется метод filter() , который в качестве параметра принимает критерий выборки:
exclude()
Метод exclude() позволяют исключить из выборки записи, которые соответвуют переданному в качестве параметра критерию:
Можно комбинировать два выше рассмотренных метода:
in_bulk()
Метод in_bulk() является более эффективным способом для чтения большого количества записей. Он возвращает словарь, то есть объект dict, тогда как методы all() , filter() и exclude() возвращают объект QuerySet :
Метод in_bulk возвращает словарь, где ключи представляют id объектов, а значения по этим ключам — собственно эти объекты, то есть в данном случае объекты Person.
Обновление
Для обновления объекта также применяется метод save() :
В этом случае Django полностью обновляет объект, все его свойства, даже если мы их не изменяли. Чтобы указать, что нам надо обновить только определенные поля, следует использовать параметр update_fields :
Это позволит повысить производительность.
update()
Другой способ обновления объектов представляет метод update() в сочетании с методом filter , которые вместе выполняют один запрос к базе данных:
Если нам не надо получать обновляемый объект, то данный способ позволит нам увеличить производительность взаимодействия с бд.
Иногда бывает необходимо изменить значение столбца в бд на основании уже имеющегося значения. В этом случае мы можем использовать функцию F() :
В данном случае полю age присваивается уже имеющееся значение, увеличенное на единицу.
При этом важно учитывать, что метод update обновляет все записи в таблице, которые соответствуют условию.
Если надо обновить вообще все записи, вне зависимости от условия, то необходимо комбинировать метод update с методом all() :
update_or_create()
Метод update_or_create обновляет запись, а если ее нет, то добавляет ее в таблицу:
Метод update_or_create() принимает два параметра. Первый параметр представляет критерий выборки объектов, которые будут обновляться. Второй параметр представляет объект со значениями, которые будут переданы записям, которые соответствуют китерию из первого параметра. Если критерию не соответствует никаких записей, то в таблицу добавляется новый объект, а переменная created будет равна True.
Удаление
Для удаления мы можем вызвать метод delete() у удаляемого объекта:
Если не требуется получение отдельного объекта из базы данных, тогда можно удалить объект с помощью комбинации методов filter() и delete() :
Просмотр строки запроса
С помощью свойства query у результата запроса мы можем получить SQL-запрос, который выполнялся. Например:
Данный код отобразит на консоли SQL-запрос типа следующего:
Источник
Модели Django
В этом руководстве мы подробно рассмотрим модели Django. Прежде чем мы это сделаем, давайте быстро настроим наш проект Django из терминала.
Поочередно выполните следующие команды:
После того, как мы создали приложение, нам нужно добавить его в INSTALLED_APPS внутри settings.py
Обратите внимание на файл models.py, созданный в приложении. Это будет самый упоминаемый файл в этом уроке.
Модели
База данных – важная часть любого веб-приложения. Модели Django – это источник информации для ваших данных. В нем можно хранить значения в виде полей.
Каждая модель Django будет храниться в базе данных, а поля, определенные в моделях, являются полями базы данных.
Их также используются для выполнения кода SQL за сценой. Давайте создадим нашу первую модель Django в файле models.py.
Пример
Ниже приведен код из файла models.py:
Student – это модель Django с четырьмя полями.
Поля модели
Модели Django могут иметь поля любого из следующих типов: CharField, IntegerField, EmailField, URLField, DateField, BooleanField, AutoField, UUIDField, OneToOneField, ManyToOneField.
Как установить первичный ключ?
- max_length – устанавливает максимально допустимое количество символов.
- verbose_name – удобочитаемое имя поля.
- null – установка null равным True позволяет нам оставить столбец пустым. Тогда в качестве значения столбец сохранит NULL.
- blank – поле снова может быть пустым, если blank = True. blank используется для проверки формы, где мы можем указать, является ли ввод в поле обязательным или нет.
- choices – это похоже на 2-кортеж и используется для выбора из списка значений.
Параметр поля по умолчанию является обязательным в вариантах выбора, если только не указано пустое или пустое значение.
Как добавить эту модель в базу данных?
Приведенная выше команда создает модель.
Это вывод терминала:
Давайте откроем файл views.py, создадим базовые модели Django и распечатаем их на экране.
save() метод добавляет модель в базу данных.
Каждый раз, когда вы загружаете эту страницу, добавлялась новая модель. Следовательно, в начале мы удаляем () все модели.
Для выбора, чтобы отобразить правую часть, мы используем автоматически сгенерированный метод get_section_display()
Отступы имеют значение!
Пришло время выполнить маршрутизацию URL-адресов в файле urls.py.
Теперь запустите следующие две команды:
CRUD операции
Альтернативный способ создания нового экземпляра модели Django:
Помимо создания, удаления и извлечения, которые мы реализовали до сих пор, мы также можем искать данные с помощью фильтров.
Как отфильтровать больше и меньше?
ordering = [«-size»] в порядке убывания.
Внешние ключи
Создадим новую модель Django и добавим внешний ключ.
Метод str определяет удобочитаемое представление модели, которое отображается на сайте администратора Django и в оболочке Django.
Внешний ключ связан с другим классом. На этот раз встроенный класс django:
- CASCADE: при удалении объекта, на который имеется ссылка, также удалите объекты, которые имеют на него ссылки (например, при удалении сообщения в блоге вы также можете удалить комментарии).
- PROTECT: запретить удаление указанного объекта. Чтобы удалить его, вам придется вручную удалить все объекты, которые на него ссылаются.
- SET_NULL: установите для ссылки значение NULL (требуется, чтобы поле допускало значение NULL). Например, когда вы удаляете пользователя, вы можете захотеть сохранить комментарии, которые он разместил к сообщениям в блоге, но сказать, что они были опубликованы анонимным (или удаленным) пользователем.
- SET_DEFAULT: установить значение по умолчанию.
through
through используется для соединения двух таблиц через промежуточный класс.
Ниже приведен наш класс models.py:
Сохраните файл и запустим в терминале следующую команду:
Мы создаем наборы индивидуальных моделей и объединяем их в классе.
При запросе модели Учителя ученики автоматически обновляются благодаря through.
Источник
Модели Django
Нам нужно что-то, что будет хранить все записи нашего блога. Но прежде давай поговорим о вещах, называемых объектами .
Объекты
В программировании существует особая концепция, она называется объектно-ориентированным программированием . Идея заключается в том, что вместо скучной последовательности инструкций мы моделируем вещи и описываем, как они взаимодействуют друг с другом.
Так что же такое объект? Это совокупность поведения и свойств. Звучит странно, но мы приведем пример.
Если мы хотим смоделировать кошку, то создадим объект Cat , который обладает определенными свойствами, например, color (цвет), age (возраст), mood (настроение: плохое, хорошее, сонное ;)), owner (хозяин, например, другой объект — Person — или, если кошка дикая, это свойство будет пустым).
Объект Cat будет иметь набор определённых действий: purr (мурчать), scratch (царапаться) или feed (кормить, где мы дадим кошке немного CatFood — кошачьей еды, которая так же может быть отдельным объектом со своими свойствами, например, taste — вкусом).
Основная идея, таким образом, заключается в описании объекта в коде, используя его параметры ( свойства объекта ) и доступные ему действия ( методы ).
Так как же мы смоделируем запись в блоге? Нам же нужен блог, верно?
Для начала стоит ответить на вопрос: что такое запись в блоге? Какие свойства она имеет?
Ну, запись наверняка содержит какой-то текст и заголовок, верно? Было бы неплохо также знать, кто её написал — так что нам нужен автор. Ну и в заключение, нам нужно знать, когда запись создана и когда опубликована.
Какие вещи можно сделать с записью в блоге? Было бы неплохо иметь метод для её публикации, согласна?
Так что нам пригодится метод publish .
Ну и раз уж мы определились с тем, что хотим получить, давай начнем моделирование в Django!
Модель в Django
Зная, что представляет из себя объект, мы можем создать модель Django для записи в блоге.
Модель в Django — это объект определённого свойства: он хранится в базе данных . База данных представляет собой совокупность различных данных. Это то место, где ты будешь хранить информацию о своих пользователях, записях в блоге и т.д. Мы будем использовать базу данных SQLite для хранения информации. Это стандартная база данных в Django — её сейчас вполне хватит для наших нужд.
Ты можешь представить модель в базе данных как электронную таблицу с колонками (полями) и строками (данными).
Создание приложения
Для аккуратности мы создадим отдельное приложение в нашем проекте. Очень удобно иметь хорошо организованное рабочее место с самого начала. Для создания приложения нам понадобится набрать следующую инструкцию в командной строке (из директории djangogirls , где находится файл manage.py ):
Mac OS X и Linux:
Обрати внимание, что в нашем проекте появилась новая папка blog , которая содержит некоторые файлы. Таким образом, структура нашего проекта будет выглядеть так:
После того, как приложение создано, нам нужно сообщить Django, что теперь он должен его использовать. Мы сделаем это с помощью файла mysite/settings.py . Нам нужно найти INSTALLED_APPS и добавить к списку ‘blog’, прямо перед ] . Конечный результат должен выглядеть следующим образом:
Создание модели записи в блоге
В файле blog/models.py мы определяем все Модели — модель записи для блога также пойдёт сюда.
Открой файл blog/models.py , удали весь текст и вставь на его место следующий код:
Убедись, что использовала два символа нижнего подчёркивания ( _ ) с обеих сторон от метода str . Это соглашение часто используется при программировании на Python, и иногда его называют «dunder» (сокращение от англ. «double-underscore»).
Смотрится страшно, да? Но не волнуйся, мы объясним, что значит каждая строка кода!
Строки, начинающиеся с from или import , открывают доступ к коду из других файлов. Так что вместо того, чтобы копировать и вставлять один и тот же код во все файлы, ты можешь сослаться на него при помощи from . import . .
class Post(models.Model): — эта строка определяет нашу модель ( объект ).
- class — это специальное ключевое слово для определения объектов.
- Post — это имя нашей модели, мы можем поменять его при желании (специальные знаки и пробелы использовать нельзя). Всегда начинай имена классов с прописной буквы.
- models.Model означает, что объект Post является моделью Django, так Django поймет, что он должен сохранить его в базу данных.
Дальше мы задаем свойства, о которых уже говорили: title , text , created_date , published_date и author . Чтобы это сделать, нам нужно определиться с типом полей (это текст? число? дата? ссылка на другой объект? например, на пользователя?).
- models.CharField — так мы определяем текстовое поле с ограничением на количество символов.
- models.TextField — так определяется поле для неограниченно длинного текста. Выглядит подходящим для содержимого поста, верно?
- models.DateTimeField — дата и время.
- models.ForeignKey — ссылка на другую модель.
Мы не будем объяснять каждую запятую, поскольку на это уйдет слишком много времени. Ознакомься с официальной документаций Django: если хочешь узнать больше о полях моделей и о том, как определять разные объекты, то эта ссылка может помочь: https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types.
Что насчёт def publish(self): ? Это как раз метод публикации для записи, о котором мы говорили. def означает, что создаётся функция/метод, а publish — это название этого метода. Можно изменить имя метода, если хочешь. Существует правило для имён функций: нужно использовать строчные буквы, а пробелы заменять на подчёркивания. Например, метод, вычисляющий среднюю цену, может называться calculate_average_price .
Методы часто возвращают что-то. Например, метод __str__ . В нашем случае после вызова метода __str__() мы получим текст (строку) с заголовком записи.
Также обрати внимание, что оба метода def publish(self): и def __str__(self): внутри класса имеют дополнительный отступ. Поскольку в Python важны отступы, нам необходимо использовать их для методов внутри класса — иначе методы не будут принадлежать к классу, и при запуске программы может получиться что-то неожиданное.
Если тема моделей тебе до сих пор непонятна — не стесняйся обратиться к тренеру! Мы знаем, что она действительно сложна, особенно когда ты изучаешь параллельно объекты и функции. Но мы надеемся, что всё это больше не кажется тебе магией!
Создаём таблицы моделей в базе данных
Последним шагом будет добавление нашей модели в базу данных. Сначала мы должны дать Django знать, что сделали изменения в нашей модели (мы её только что создали!). Набери python manage.py makemigrations blog . Должно получиться примерно так:
Примечание: не забудь сохранить отредактированные файлы. Иначе твой компьютер выполнит команду с их предыдущей версией, и могут появиться неожиданные ошибки.
Django создал для нас файл с миграцией для базы данных. Набери python manage.py migrate blog , результат должен быть следующим:
Ура! Модель записи для блога теперь в базе данных, и было бы неплохо посмотреть на неё, верно? Тогда переходи к следующей главе!
Источник