SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
Реляционные
базы данных
Решаемые проблемы
•   Структура хранения
•   Эффективный поиск данных
•   Управление памятью
•   Совместный доступ к данным
•   Атомарные операции - транзакции
•   Язык управления базой и данными - SQL
2
Реляционная модель данных
Данные хранятся в виде таблиц. У каждой таблицы фиксированное
число столбцов. Все данные в столбце одного типа.
3
Проектирование базы данных
Основная задача проектирования - сокращение избыточности и
дублирования данных.
Существуют формальные правила проверки схемы базы данных на
«правильность» - нормальные формы базы данных.
4
Проектирование на практике
•   Логическое разделение сущностей
•   Выделение синтетических первичных ключей
•   Связи 1:N, N:1 реализуются через внешний ключ
•   Связи N:M реализуются через промежуточную таблицу
•   Атрибут с фиксированным числом значений – внешняя таблица
либо поле типа enum
5
Базы данных в
Python
Подключение к базе
Полное интерфейса для работы с СУБД в PEP-0249
import MySQLdb
db = MySQLdb.connect(host="localhost", user="joe",
passwd="moonpie", db="thangs")
cursor = db.cursor()
# запросы с использованием cursor
db.commit()
db.close()
7
Выполнение запросов
cursor.execute("""
update users set age = age + 1 where name = %s
""", (name,))
cursor.execute("select * from users")
users = cursor.fetchall()
cursor.execute("""
select * from users where name = %s
""", (name,))
user = cursor.fetchone()
8
Вставка многих записей
cursor.executemany(
"INSERT INTO users (name, age) VALUES (%s, %s)",
[
("Igor", 18 ),
("Petr", 16 ),
("Dasha", 17 )
]
)
db.commit()
db.close()
9
Placeholders
email = "' OR '1'='1"
cursor.execute(
"SELECT * FROM users WHERE email = '" + email + "'"
)
cursor.execute(
"SELECT * FROM users WHERE email = '%s'",
email
)
10
Базы данных в
Django
Прямой доступ к базе
from django.db import connection, connections
cur = connection.cursor()
cur.execute("select * from tbl limit 10")
default_cur = connections['default'].cursor()
default_cur.execute("select * from tbl2 limit 10")
another_cur = connections['another'].cursor()
another_cur.execute("select * from tbl2 limit 10")
12
Полезные утилиты
•   ./manage.py validate - проверить структуру моделей
•   ./manage.py syncdb - создать таблицы в базе (1 раз)
•   ./manage.py shell - запустить python shell
•   ./manage.py dbshell - запустить клиент базы данных
13
Django Models
ORM - Object relational mapping - библиотек предоставляющая
объектно-ориентированный интерфейс к реляционной базе
данных. Django Models - библиотека ORM в Djnago.
Django SQL
класс Модели Таблица
объект модели строка таблицы
QuerySet запрос
14
ORM vs SQL
cursor.execute('select * from users where age > 18')
for user in cursor.fetchall():
pk, name, age = user
print name
for user in User.objects.filter(age__gt=18):
print user.name
15
Модели Django
class Post(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
creation_date = models.DateTimeField(blank=True)
def __unicode__(self):
return self.title
def get_absolute_url(self):
return '/post/%d/' % self.pk
class Meta:
db_table = 'blogposts'
ordering = ['-creation_date']
16
Типы полей
Django MySQL
CharField VARCHAR(N)
EmailField
TextField LONGTEXT
BooleanField TINYINT(1)
IntegerField INT(11)
DateField DATE
DateTimeField DATETIME
17
Свойства полей
•   blank - поле может быть пустым
•   null - при этом хранится в базе как NULL
•   max_length - максимальная длина поля
•   primary_key - это поле - первичный ключ
•   unique - поле уникально
•   db_index - для этого поля нужен индекс в базе
•   default - значение по-умолчанию
•   choices - варианты значений
18
Связи между
моделями
Связи между моделями
class Post(models.Model):
title = models.CharField(max_length=255)
# еще поля...
category = models.ForeignKey(Category,
null=True, on_delete=models.SET_NULL)
status = models.OneToOneField(PostStatus)
tags = models.ManyToManyField(Tag)
20
Реализация в СУБД
21
Ограничения внешних ключей
Применимо к полям типа ForeignKey , OneToOneField
•   RESTRICT → models.PROTECT
•   CASCADE → models.CASCADE
•   SET NULL → models.SET_NULL
•   NO ACTION → models.DO_NOTHING
22
Использование отношений в коде
# прямое использование
post = Post.objects.get(pk=1)
category = post.category # Category
category_id = post.category_id # int
status = post.status # Status
status_id = post.status_id # int
tags_manager = post.tags # RelatedManager
post.tags.all() # [ Tags ]
# использование обратного отношения
category.post_set.all() # [ Post ]
tag.post_set.all() # [ Post ]
23

Contenu connexe

Tendances

I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
ITmozg
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
2ГИС Технологии
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
 
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
Viktor Likin
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
Yii development
Yii developmentYii development
Yii development
MageCloud
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
Magento Dev
 

Tendances (20)

I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
Что нового в Django 1.4
Что нового в Django 1.4Что нового в Django 1.4
Что нового в Django 1.4
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Server optimization
Server optimizationServer optimization
Server optimization
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregation
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
DrupalCamp Kyiv 2011. Views - стандарт вывода списка данных. Расширение Views...
 
Django
DjangoDjango
Django
 
Templates kachalova 2014_new
Templates kachalova 2014_newTemplates kachalova 2014_new
Templates kachalova 2014_new
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Kranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenkoKranonit s16 (python). dmitry furzenko
Kranonit s16 (python). dmitry furzenko
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Yii development
Yii developmentYii development
Yii development
 
Внутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpackВнутреннее устройство и оптимизация бандла webpack
Внутреннее устройство и оптимизация бандла webpack
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 

En vedette

AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
Ontico
 

En vedette (18)

09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки09 - Web-технологии. MVC фреймворки
09 - Web-технологии. MVC фреймворки
 
16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX16 - Web-технологии. Технология AJAX
16 - Web-технологии. Технология AJAX
 
15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация15 - Web-технологии. Сессии и авторизация
15 - Web-технологии. Сессии и авторизация
 
14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм14 - Web-технологии. Обработка форм
14 - Web-технологии. Обработка форм
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
 
02 - Установка macOS
02 - Установка macOS02 - Установка macOS
02 - Установка macOS
 
03 - Установка Xcode
03 - Установка Xcode03 - Установка Xcode
03 - Установка Xcode
 
01 - Системные требования
01 - Системные требования01 - Системные требования
01 - Системные требования
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений
 
02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты02 - Web-технологии. Web-клиенты
02 - Web-технологии. Web-клиенты
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 
Практический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UMLПрактический анализ и визуальное моделирование на UML
Практический анализ и визуальное моделирование на UML
 
08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend08 - Web-технологии. Архитектура frontend-backend
08 - Web-технологии. Архитектура frontend-backend
 
66 - Spring. Spring и JSF
66 - Spring. Spring и JSF66 - Spring. Spring и JSF
66 - Spring. Spring и JSF
 
06 - Web-технологии. Протокол HTTP
06 - Web-технологии. Протокол HTTP06 - Web-технологии. Протокол HTTP
06 - Web-технологии. Протокол HTTP
 
05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы05 - Web-технологии. Сетевые протоколы
05 - Web-технологии. Сетевые протоколы
 
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
 

Similaire à 11 - Web-технологии. Работа с СУБД

Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
Стажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данныхСтажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данных
7bits
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
Ontico
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
7bits
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
Vitaliy Trenkenshu
 

Similaire à 11 - Web-технологии. Работа с СУБД (20)

Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
 
базы данных
базы данныхбазы данных
базы данных
 
Стажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данныхСтажировка-2013, разработчики, занятие 11. Базы данных
Стажировка-2013, разработчики, занятие 11. Базы данных
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 08
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
 
32 - Базы данных. Пространственные индексы
32 - Базы данных. Пространственные индексы32 - Базы данных. Пространственные индексы
32 - Базы данных. Пространственные индексы
 
Object-Relational Mapping for Dummies
Object-Relational Mapping for DummiesObject-Relational Mapping for Dummies
Object-Relational Mapping for Dummies
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
Microsoft access 2007
Microsoft access 2007Microsoft access 2007
Microsoft access 2007
 
Microsoft access 2007
Microsoft access 2007Microsoft access 2007
Microsoft access 2007
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
Лекция 6: Работа с данными. Django ORM
Лекция 6: Работа с данными. Django ORMЛекция 6: Работа с данными. Django ORM
Лекция 6: Работа с данными. Django ORM
 
9946
99469946
9946
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 
Моделирование для NoSQL БД
Моделирование для NoSQL БДМоделирование для NoSQL БД
Моделирование для NoSQL БД
 

Plus de Roman Brovko

Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 

Plus de Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

11 - Web-технологии. Работа с СУБД

  • 2. Решаемые проблемы •   Структура хранения •   Эффективный поиск данных •   Управление памятью •   Совместный доступ к данным •   Атомарные операции - транзакции •   Язык управления базой и данными - SQL 2
  • 3. Реляционная модель данных Данные хранятся в виде таблиц. У каждой таблицы фиксированное число столбцов. Все данные в столбце одного типа. 3
  • 4. Проектирование базы данных Основная задача проектирования - сокращение избыточности и дублирования данных. Существуют формальные правила проверки схемы базы данных на «правильность» - нормальные формы базы данных. 4
  • 5. Проектирование на практике •   Логическое разделение сущностей •   Выделение синтетических первичных ключей •   Связи 1:N, N:1 реализуются через внешний ключ •   Связи N:M реализуются через промежуточную таблицу •   Атрибут с фиксированным числом значений – внешняя таблица либо поле типа enum 5
  • 7. Подключение к базе Полное интерфейса для работы с СУБД в PEP-0249 import MySQLdb db = MySQLdb.connect(host="localhost", user="joe", passwd="moonpie", db="thangs") cursor = db.cursor() # запросы с использованием cursor db.commit() db.close() 7
  • 8. Выполнение запросов cursor.execute(""" update users set age = age + 1 where name = %s """, (name,)) cursor.execute("select * from users") users = cursor.fetchall() cursor.execute(""" select * from users where name = %s """, (name,)) user = cursor.fetchone() 8
  • 9. Вставка многих записей cursor.executemany( "INSERT INTO users (name, age) VALUES (%s, %s)", [ ("Igor", 18 ), ("Petr", 16 ), ("Dasha", 17 ) ] ) db.commit() db.close() 9
  • 10. Placeholders email = "' OR '1'='1" cursor.execute( "SELECT * FROM users WHERE email = '" + email + "'" ) cursor.execute( "SELECT * FROM users WHERE email = '%s'", email ) 10
  • 12. Прямой доступ к базе from django.db import connection, connections cur = connection.cursor() cur.execute("select * from tbl limit 10") default_cur = connections['default'].cursor() default_cur.execute("select * from tbl2 limit 10") another_cur = connections['another'].cursor() another_cur.execute("select * from tbl2 limit 10") 12
  • 13. Полезные утилиты •   ./manage.py validate - проверить структуру моделей •   ./manage.py syncdb - создать таблицы в базе (1 раз) •   ./manage.py shell - запустить python shell •   ./manage.py dbshell - запустить клиент базы данных 13
  • 14. Django Models ORM - Object relational mapping - библиотек предоставляющая объектно-ориентированный интерфейс к реляционной базе данных. Django Models - библиотека ORM в Djnago. Django SQL класс Модели Таблица объект модели строка таблицы QuerySet запрос 14
  • 15. ORM vs SQL cursor.execute('select * from users where age > 18') for user in cursor.fetchall(): pk, name, age = user print name for user in User.objects.filter(age__gt=18): print user.name 15
  • 16. Модели Django class Post(models.Model): title = models.CharField(max_length=255) content = models.TextField() creation_date = models.DateTimeField(blank=True) def __unicode__(self): return self.title def get_absolute_url(self): return '/post/%d/' % self.pk class Meta: db_table = 'blogposts' ordering = ['-creation_date'] 16
  • 17. Типы полей Django MySQL CharField VARCHAR(N) EmailField TextField LONGTEXT BooleanField TINYINT(1) IntegerField INT(11) DateField DATE DateTimeField DATETIME 17
  • 18. Свойства полей •   blank - поле может быть пустым •   null - при этом хранится в базе как NULL •   max_length - максимальная длина поля •   primary_key - это поле - первичный ключ •   unique - поле уникально •   db_index - для этого поля нужен индекс в базе •   default - значение по-умолчанию •   choices - варианты значений 18
  • 20. Связи между моделями class Post(models.Model): title = models.CharField(max_length=255) # еще поля... category = models.ForeignKey(Category, null=True, on_delete=models.SET_NULL) status = models.OneToOneField(PostStatus) tags = models.ManyToManyField(Tag) 20
  • 22. Ограничения внешних ключей Применимо к полям типа ForeignKey , OneToOneField •   RESTRICT → models.PROTECT •   CASCADE → models.CASCADE •   SET NULL → models.SET_NULL •   NO ACTION → models.DO_NOTHING 22
  • 23. Использование отношений в коде # прямое использование post = Post.objects.get(pk=1) category = post.category # Category category_id = post.category_id # int status = post.status # Status status_id = post.status_id # int tags_manager = post.tags # RelatedManager post.tags.all() # [ Tags ] # использование обратного отношения category.post_set.all() # [ Post ] tag.post_set.all() # [ Post ] 23