Web-программирование Лекция 7. Django.
4.79M
Category: internetinternet

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

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

асист. каф. 308 Трутнева Надежда Владимировна
тел: 8-926-880-12-76
почта: [email protected]

2.

MVC (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 для этого поля.
Первый элемент каждого кортежа – это значение, которое будет сохранено в базе
данных. Второй элемент – название, которое будет отображаться для пользователей.

6.

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

7.

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

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 или несколько экземпляров
сущности А.
Ученик Иванов учится у нескольких преподавателей. И каждый
преподаватель работает со многими учениками.

18.

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

19.

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

20.

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

21.

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

22.

Методы модели
__str__() (Python 3)
“Волшебный метод” Python, который возвращает unicode “представление” объекта.
Это то, что Python и Django используют для отображения объекта как строки,
обычно в консоли, интерфейсе администратора или шаблоне.
Желательно определить этот метод, т.к. значение по умолчанию не слишком
привлекательно.
__unicode__() (Python 2)
Python 2 аналог __str__().

23.

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

24.

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

25.

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

26.

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

27.

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

28.

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

29.

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

30.

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

31.

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

32.

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

33.

Спасибо за внимание !
ВОПРОСЫ???
English     Русский Rules