Web-программирование Лекция 7. Django

Содержание

Слайд 2

MVC (MTV) Model-View-Controller (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения,

MVC (MTV)

Model-View-Controller (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения, пользовательского

интерфейса и управляющей логики на три отдельных компонента: модель, представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо.
Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя свое состояние.
Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели.
Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений
Слайд 3

Модели Название таблицы, myapp_person, автоматически создано с метаданных модели и может

Модели

Название таблицы, myapp_person, автоматически создано с метаданных модели и может быть переопределено.


Поле id добавлено автоматически, но его также можно переопределить.
CREATE TABLE SQL в этом примере соответствует синтаксису PostgreSQL, но стоит учесть что Django использует синтаксис SQL соответственно настройкам базы данных в файле настроек.
Слайд 4

Модели Самая важная часть модели – и единственная обязательная – это

Модели

Самая важная часть модели – и единственная обязательная – это список

полей таблицы базы данных которые она представляет. Поля определены атрибутами класса. Нельзя использовать имена конфликтующие с API моделей, такие как clean, save или delete.
Слайд 5

Параметры поля null Field.null При True Django сохранит пустое значение как

Параметры поля

null
Field.null
При True Django сохранит пустое значение как NULL в базе данных. Значение по умолчанию

– False.
blank
Field.blank
При True поле может быть пустым. Значение по умолчанию – False.
Заметим что этот параметр отличается от null. Null указывается для базы данных, в то время как Blank – для проверки данных. При blank=True, проверка данных в форме позволит сохранять пустое значение в поле. При blank=False поле будет обязательным.
choices
Field.choices
Итератор (например, список или кортеж) двухэлементных кортежей(например, [(A, B), (A, B) ...]), который будет использоваться как варианты значений для поля. Если этот параметр указан, в форме будет использоваться select для этого поля.
Первый элемент каждого кортежа – это значение, которое будет сохранено в базе данных. Второй элемент – название, которое будет отображаться для пользователей. 
Слайд 6

Параметры поля

Параметры поля

Слайд 7

Параметры поля

Параметры поля

Слайд 8

Параметры поля error_messages Field.error_messages error_messages позволяет переопределить сообщения ошибок возвращаемых полем.

Параметры поля

error_messages
Field.error_messages
error_messages позволяет переопределить сообщения ошибок возвращаемых полем. Используйте словарь с ключами

соответствующими необходимым ошибкам.
Ключи ошибок такие: null, blank, invalid, invalid_choice, unique и ``unique_for_date`. 
primary_key
Field.primary_key
При True это поле будет первичным ключом.
Если вы не укажите primary_key=True для какого-либо поля в модели, Django самостоятельно добавит AutoField для хранения первичного ключа, вы не обязаны указывать primary_key=True, если не хотите переопределить первичный ключ по умолчанию.
primary_key=True подразумевает null=False и unique=True. Модель может содержать только один первичный ключ.
Первичный ключ доступен только для чтения. Если вы поменяете значение для существующего объекта и сохраните его, будет создан новый объект.
unique
Field.unique
При True значение поля должно быть уникальным.
Этот параметр учитывается при сохранении в базу данных и при проверке данных в модели. Если вы попытаетесь сохранить повторное значение в поле с unique, будет вызвана ошибка django.db.IntegrityError методом save().
Этот параметр можно использовать для любого типа поля кроме ManyToManyField, OneToOneField и FileField.
Слайд 9

Типы полей AutoField class AutoField(**options) Автоинкрементное поле IntegerField. Используется для хранения

Типы полей

AutoField
class AutoField(**options)
Автоинкрементное поле IntegerField. Используется для хранения ID. Скорее всего вам не

придется использовать это поле, первичный ключ будет автоматически добавлен к модели.
BigIntegerField
class BigIntegerField(**options)
64-битное целочисленное, аналогично IntegerField но позволяет хранить числа от -9223372036854775808 до 9223372036854775807. Форма будет использовать TextInput для отображения.
BinaryField
class BinaryField(**options)
Поля для хранения бинарных данных. Принимает значение типа bytes. Это поле имеет ограниченный функционал. Например, QuerySet нельзя фильтровать по значению BinaryField.
BooleanField
class BooleanField(**options)
Поле хранящее значение true/false.
Виджет по умолчанию для этого поля CheckboxInput.
Если вам нужен параметр null, используйте поле NullBooleanField.
Значение по умолчанию для BooleanField None, если Field.default не указан.
CharField
class CharField(max_length=None, **options)
Строковое поле для хранения коротких или длинных строк.
Для большого количества текстовой информации используйте TextField.
Виджет по умолчанию для этого поля TextInput.
CharField принимает один дополнительный аргумент:CharField.max_length
Максимальная длинна(в символах) этого поля. max_length используется для проверки данных на уровне базы данных и форм Django.
Слайд 10

Типы полей DateField class DateField(auto_now=False, auto_now_add=False, **options) Дата, представленная в виде

Типы полей

DateField
class DateField(auto_now=False, auto_now_add=False, **options)
Дата, представленная в виде объекта datetime.date Python. Принимает несколько дополнительных параметров:
DateField.auto_now
Значение поля

будет автоматически установлено в текущую дату при каждом сохранении объекта. Полезно для хранения времени последнего изменения. Заметим, что текущее время будет использовано всегда; это не просто значение по умолчанию, которое вы можете переопределить.
DateField.auto_now_add
Значение поля будет автоматически установлено в текущую дату при создании(первом сохранении) объекта. Полезно для хранения времени создания. Заметим, что текущее время будет использовано всегда; это не просто значение по-умолчанию, которое вы можете переопределить. По этому, даже если вы укажите значение для этого поля, оно будет проигнорировано. Если вы хотите изменять значения этого поля, используйте следующее вместо auto_now_add=True:
Для DateField: default=date.today - из datetime.date.today()
Для DateTimeField: default=timezone.now - из django.utils.timezone.now()
В форме поле будет представлено как :class:`~django.forms.TextInput с JavaScript календарем, и кнопкой “Сегодня”. Содержит дополнительную ошибку invalid_date.
Опции auto_now_add, auto_now и default взаимоисключающие. Использование их вместе вызовет ошибку.
Слайд 11

Типы полей EmailField class EmailField(max_length=254, **options) Поле CharField для хранения правильного

Типы полей

EmailField
class EmailField(max_length=254, **options)
Поле CharField для хранения правильного email-адреса. Использует EmailValidator для проверки значения.
FloatField
class FloatField(**options)
Число с плавающей точкой

представленное объектом float.
Виджет по умолчанию в форме для этого поля - NumberInput, если localize равен False, иначе TextInput.
ImageField
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
Наследует все атрибуты и методы поля FileField, но также проверяет является ли загруженный файл изображением.
В дополнение к атрибутам поля FileField ImageField содержит также height и width.
Для определения этих аргументов ImageField принимает дополнительные аргументы:
ImageField.height_field
Имя поля, которому автоматически будет присвоено значение высоты изображения при каждом сохранении объекта.
ImageField.width_field
Имя поля, которому автоматически будет присвоено значение ширины изображения при каждом сохранении объекта.
Требуется библиотека Pillow (для работы с изображениями).
По-умолчанию, экземпляр ImageField создается как колонка varchar в базе данных. Как и с другими полями вы можете изменить максимальную длину используя аргумент max_length.
Виджет форма для этого поля - ClearableFileInput.
Слайд 12

Типы полей GenericIPAddressField¶ class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options) Адрес IPv4 или IPv6

Типы полей

GenericIPAddressField¶
class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)
Адрес IPv4 или IPv6 в виде строки (например, 192.0.2.30 или 2a02:42fe::4). Форма использует

виджет TextInput.
Преобразование адреса IPv6 происходит в соответствии с RFC 4291#section-2.2 раздел 2.2, включая рекомендации по форматированию IPv4 в параграфа 3 этого раздела, таких как ::ffff:192.0.2.0.
Например, 2001:0::0:01 будет преобразован 2001::1, а ::ffff:0a0a:0a0a в ::ffff:10.10.10.10. Все символы будут преобразованы в нижний регистр.
GenericIPAddressField.protocol
Определяет формат IP адреса. Принимает значение 'both' (по умолчанию), 'IPv4' или 'IPv6'. Значение не чувствительно регистру.
GenericIPAddressField.unpack_ipv4
Преобразует адрес IPv4. Если эта опция установлена, адрес ::ffff::192.0.2.1 будет преобразован в 192.0.2.1. По-умолчанию отключена. Может быть использовано, если protocolустановлен в 'both'.
Если вы разрешили пустые значение, необходимо также разрешить null т.к. пустые значения сохраняются как null.
URLField
class URLField(max_length=200, **options)
Поле CharField для URL.
Виджет по умолчанию для этого поля TextInput.
Как подкласс CharField URLField принимает необязательный аргумент max_length. Если вы не укажите max_length, будет использовано значение – 200.
Слайд 13

Типы полей UUIDField class UUIDField(**options) Поля для сохранения UUID. Использует класс

Типы полей

UUIDField
class UUIDField(**options)
Поля для сохранения UUID. Использует класс Python UUID. Для PostgreSQL используется

тип uuid, иначе char(32).
UUID является хорошей альтернативой AutoField с primary_key.
База данных не сгенерирует UUID за вас, по этому следует использовать default:
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) # other fields
Обратите внимание, указана функция (без скобок) в default, а не объект UUID.
Слайд 14

Виды связей между таблицами 1. «Один-к-одному» - любому экземпляру сущности А

Виды связей между таблицами

1. «Один-к-одному» - любому экземпляру сущности А соответствует только один

экземпляр сущности В, и наоборот.
У любого конкретного ученика может быть только одна характеристика, и эта характеристика относится к единственному ученику.
Слайд 15

Виды связей между таблицами 2. «Один-ко-многим» - любому экземпляру сущности А

Виды связей между таблицами

2.  «Один-ко-многим» - любому экземпляру сущности А соответствует 0, 1

или несколько экземпляров сущности В, но любому экземпляру сущности В соответствует только один экземпляр сущности А.
Ученику ставят много оценок; поставленная оценка принадлежит только одному ученику.
Слайд 16

Виды связей между таблицами 3. «Многие-к-одному» - любому экземпляру сущности А

Виды связей между таблицами

3. «Многие-к-одному» - любому экземпляру сущности А соответствует только один

экземпляр сущности В, но любому экземпляру сущности В соответствует 0, 1 или несколько экземпляров сущности А.
Преподаватель работает только в одном кабинете, однако рабочий кабинет может быть закреплен за несколькими преподавателями.
Какая же разница между связями «один-ко-многим» и «многие-к-одному»? Такая же, как между фразами «портфель ученика» и «ученик портфеля». То есть важно, кто во взаимоотношении двух объектов главный - ученик или портфель. Суть отношений двух объектов отражается в имени связи.
Слайд 17

Виды связей между таблицами 4. «Многие-ко-многим» - любому экземпляру сущности А

Виды связей между таблицами

4.  «Многие-ко-многим» - любому экземпляру сущности А соответствует 0, 1

или несколько экземпляров сущности В, и любому экземпляру сущности В соответствует 0, 1 или несколько экземпляров сущности А.
Ученик Иванов учится у нескольких преподавателей. И каждый преподаватель работает со многими учениками.
Слайд 18

Поля отношений

Поля отношений

Слайд 19

Поля отношений

Поля отношений

Слайд 20

Поля отношений Связь один-к-одному Для определения связи один-к-одному используется OneToOneField. Вы

Поля отношений

Связь один-к-одному
Для определения связи один-к-одному используется OneToOneField. Вы используете его так

же, как и другие типы Field: добавляя как атрибут в модель.
Чаще всего связь одни-к-одному используется для первичного ключа для модели, которая “расширяет” другую модель.
Для OneToOneField необходимо указать обязательный позиционный аргумент: класс связанной модели.
Например, вам необходима база данных “строений”, обычным дело будет добавить адрес, номер телефона и др. в базу данных. После, если вы захотите дополнить базу данных строений ресторанами, вместо того, чтобы повторять поля в модели Restaurant, вы можете добавить в модель Restaurant поле OneToOneField связанное с Place (т.к. ресторан “это” строение; вы можете использовать наследование моделей, которое на самом деле работает через связь один-к-одному).
Так же как и для ForeignKey, вы можете использовать рекурсивную связь и связь на себя.
Слайд 21

Ограничения при выборе названия поля

Ограничения при выборе названия поля

Слайд 22

Методы модели __str__() (Python 3) “Волшебный метод” Python, который возвращает unicode

Методы модели

__str__() (Python 3)
“Волшебный метод” Python, который возвращает unicode “представление” объекта. Это

то, что Python и Django используют для отображения объекта как строки, обычно в консоли, интерфейсе администратора или шаблоне.
Желательно определить этот метод, т.к. значение по умолчанию не слишком привлекательно.
__unicode__() (Python 2)
Python 2 аналог __str__().
Слайд 23

Переопределение методов модели

Переопределение методов модели

Слайд 24

Наследование моделей Наследование моделей в Django работает почти так же, как

Наследование моделей

Наследование моделей в Django работает почти так же, как и

наследование классов в Python, но следует соблюдать правила, описанные выше. Это означает, что базовый класс должен наследоваться от django.db.models.Model.
Единственное, что вам нужно определить, это должна ли родительская модель быть независимой моделью (с собственной таблицей в базе данных), или же родительская модель просто контейнер для хранения информации, доступной только через дочерние модели.
Существует три вида наследования моделей в Django.
1. Чаще всего вы будете использовать родительскую модель для хранения общих полей, чтобы не добавлять их в каждую дочернюю модель. Если вы не собираетесь использовать его как независимую модель – Абстрактные модели то, что вам нужно.
2. Если родительская модель независимая(возможно, из другого приложения) и должна храниться в отдельной таблице, Multi-table наследование то, что вам нужно.
3. Если же вы хотите переопределить поведение модели на уровне Python, не меняя структуры базы данных, вы можете использовать Proxy-модели.
Слайд 25

Выполнение запросов

Выполнение запросов

Слайд 26

Выполнение запросов

Выполнение запросов

Слайд 27

Выполнение запросов

Выполнение запросов

Слайд 28

Выполнение запросов

Выполнение запросов

Слайд 29

Выполнение запросов

Выполнение запросов

Слайд 30

Выполнение запросов

Выполнение запросов

Слайд 31

Выполнение запросов

Выполнение запросов

Слайд 32

Выполнение запросов

Выполнение запросов