Слайд 1Web-программирование
Лекция 7. Django.
асист. каф. 308 Трутнева Надежда Владимировна
тел: 8-926-880-12-76
почта: ntrutn@gmail.com
Слайд 2MVC (MTV)
Model-View-Controller (MVC, «Модель-Представление-Контроллер», «Модель-Вид-Контроллер») — схема разделения данных приложения,
пользовательского интерфейса и управляющей логики на три отдельных компонента: модель,
представление и контроллер — таким образом, что модификация каждого компонента может осуществляться независимо.
Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя свое состояние.
Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели.
Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений
Слайд 3Модели
Название таблицы, myapp_person, автоматически создано с метаданных модели и может быть
переопределено.
Поле id добавлено автоматически, но его также можно переопределить.
CREATE TABLE SQL в
этом примере соответствует синтаксису PostgreSQL, но стоит учесть что Django использует синтаксис SQL соответственно настройкам базы данных в файле настроек.
Слайд 4Модели
Самая важная часть модели – и единственная обязательная – это
список полей таблицы базы данных которые она представляет. Поля определены
атрибутами класса. Нельзя использовать имена конфликтующие с API моделей, такие как clean, save или delete.
Слайд 5Параметры поля
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 для этого поля.
Первый элемент каждого кортежа – это значение, которое будет сохранено в базе данных. Второй элемент – название, которое будет отображаться для пользователей.
Слайд 8Параметры поля
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. Используется для хранения 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)
Дата, представленная в виде объекта 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 для хранения правильного 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 в виде строки (например, 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. Использует класс 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. «Один-к-одному» - любому экземпляру сущности А соответствует только
один экземпляр сущности В, и наоборот.
У любого конкретного ученика может
быть только одна характеристика, и эта характеристика относится к единственному ученику.
Слайд 15Виды связей между таблицами
2. «Один-ко-многим» - любому экземпляру сущности А соответствует 0,
1 или несколько экземпляров сущности В, но любому экземпляру сущности
В соответствует только один экземпляр сущности А.
Ученику ставят много оценок; поставленная оценка принадлежит только одному ученику.
Слайд 16Виды связей между таблицами
3. «Многие-к-одному» - любому экземпляру сущности А соответствует только
один экземпляр сущности В, но любому экземпляру сущности В соответствует
0, 1 или несколько экземпляров сущности А.
Преподаватель работает только в одном кабинете, однако рабочий кабинет может быть закреплен за несколькими преподавателями.
Какая же разница между связями «один-ко-многим» и «многие-к-одному»? Такая же, как между фразами «портфель ученика» и «ученик портфеля». То есть важно, кто во взаимоотношении двух объектов главный - ученик или портфель. Суть отношений двух объектов отражается в имени связи.
Слайд 17Виды связей между таблицами
4. «Многие-ко-многим» - любому экземпляру сущности А соответствует 0,
1 или несколько экземпляров сущности В, и любому экземпляру сущности
В соответствует 0, 1 или несколько экземпляров сущности А.
Ученик Иванов учится у нескольких преподавателей. И каждый преподаватель работает со многими учениками.
Слайд 20Поля отношений
Связь один-к-одному
Для определения связи один-к-одному используется OneToOneField. Вы используете его
так же, как и другие типы Field: добавляя как атрибут в
модель.
Чаще всего связь одни-к-одному используется для первичного ключа для модели, которая “расширяет” другую модель.
Для OneToOneField необходимо указать обязательный позиционный аргумент: класс связанной модели.
Например, вам необходима база данных “строений”, обычным дело будет добавить адрес, номер телефона и др. в базу данных. После, если вы захотите дополнить базу данных строений ресторанами, вместо того, чтобы повторять поля в модели Restaurant, вы можете добавить в модель Restaurant поле OneToOneField связанное с Place (т.к. ресторан “это” строение; вы можете использовать наследование моделей, которое на самом деле работает через связь один-к-одному).
Так же как и для ForeignKey, вы можете использовать рекурсивную связь и связь на себя.
Слайд 21Ограничения при выборе названия поля
Слайд 22Методы модели
__str__() (Python 3)
“Волшебный метод” Python, который возвращает unicode “представление” объекта.
Это то, что Python и Django используют для отображения объекта
как строки, обычно в консоли, интерфейсе администратора или шаблоне.
Желательно определить этот метод, т.к. значение по умолчанию не слишком привлекательно.
__unicode__() (Python 2)
Python 2 аналог __str__().
Слайд 24Наследование моделей
Наследование моделей в Django работает почти так же, как
и наследование классов в Python, но следует соблюдать правила, описанные
выше. Это означает, что базовый класс должен наследоваться от django.db.models.Model.
Единственное, что вам нужно определить, это должна ли родительская модель быть независимой моделью (с собственной таблицей в базе данных), или же родительская модель просто контейнер для хранения информации, доступной только через дочерние модели.
Существует три вида наследования моделей в Django.
1. Чаще всего вы будете использовать родительскую модель для хранения общих полей, чтобы не добавлять их в каждую дочернюю модель. Если вы не собираетесь использовать его как независимую модель – Абстрактные модели то, что вам нужно.
2. Если родительская модель независимая(возможно, из другого приложения) и должна храниться в отдельной таблице, Multi-table наследование то, что вам нужно.
3. Если же вы хотите переопределить поведение модели на уровне Python, не меняя структуры базы данных, вы можете использовать Proxy-модели.