- Документация: https://docs.djangoproject.com/en/2.0/topics/db/
Шередеко Василий, [email protected]
ORM - Object Relational Mapping
Технология программирования, которая связывает базы данных с концепциями ООП @wikipedia
- Декларативное описание таблиц (
models.Model
) - Хранение изменений структур таблиц
- Запросы к таблицам
- Скорость разработки
- Абстракция от SQL
Поле для хранения логических значений: True
и False
Поле для хранения целых чисел в промежутке от -32768
to 32767
.
Поле для хранения целых чисел в промежутке от -2147483648
to 2147483647
.
Поле для хранения целых чисел в промежутке от -9223372036854775808
до 9223372036854775807
.
Поле для хранения целых чисел в промежутке от 0
to 32767
.
Поле для хранения целых чисел в промежутке от 0
to 2147483647
.
Поле для хранения строк
max_length
- максимальная длина значения
Поле для хранения чисел с плавающей точкой
Поле для хранения чисел с фиксированной точкой
max_digits
- максимальное количество цифр.decimal_places
- количество цифр после точки.
Поле для хранения дат
Поле для хранения времени
Поле для хранения даты и времени
auto_now_add
- использовать текущие дату и время как значение по умолчанию.
Поле для хранения email
Поле для хранения файлов
-
upload_to
- путь где хранятся файлы или функция:def upload_to(instance, filename): ...
Поле для хранения файлов с изображениями
-
upload_to
- путь где хранятся файлы или функция:def upload_to(instance, filename): ...
Поле для хранения ссылки на внешнюю модель (один-ко-многим).
related_name
- название обратного аттрибута.on_delete
- поведение при удалении
https://en.wikipedia.org/wiki/One-to-many_(data_model)
Поле для хранения ссылки на внешнюю модель
related_name
- название обратного аттрибута.-
on_delete
- поведение при удалении
https://en.wikipedia.org/wiki/Many-to-many_(data_model)
Значения on_delete
:
models.CASCADE
- каскадное удалениеmodels.PROTECT
- запрещает удалениеmodels.SET_NULL
- выставляет значение поля в Nonemodels.SET_DEFAULT
- выставляет значение по умолчаниюmodels.SET
- выставляемmodels.DO_NOTHING
- ничего не делаем
Поле для хранения ссылки на внешнюю модель
related_name
- название обратного аттрибута.
https://en.wikipedia.org/wiki/Many-to-many_(data_model)
default
- значение по умолчанию.null
- значение поля может отсуствовать.blank
- значение поля может быть пустым.editable
- значение можно редактировать.unique
- есть уникальный индекс по полю.
Миграции предназначены для переноса изменений из моделей в базу данных.
- Документация: https://docs.djangoproject.com/en/2.0/topics/migrations/
python manage.py makemigrations <app>
python manage.py migrate <app>
python manage.py migrate <app>
python manage.py showmigrations
Создание нового объекта в БД
obj = Article.objects.create(name='Статья')
Получить один объект из запроса
obj = Article.objects.get(name='Hello world!')
DoesNotExist
- если результат пустойMultipleObjectsReturned
- если в результате найдено более одного объекта.
Получить объект из БД или создать его, если он там отсуствует
obj, created = Article.objects.create(name='Статья')
MultipleObjectsReturned
- если в результате найдено более одного объекта.
Удалить объекты из результат запроса в БД
queryset = Article.objects.all().delete()
Получить копию запроса
queryset = Article.objects.all()
Отфильтровать объекты из результата запроса
queryset = Article.objects.filter(name='FIFA 2018')
Убрать объекты из результата запроса
queryset = Article.objects.exclude(name='FIFA 2018')
Отсортировать объекты в результате запроса
queryset = Article.objects.order_by('name')
Убрать одинаковые объекты из результата запроса
queryset = Article.objects.distinct()
Получить количество объектов в результате запроса
length = Article.objects.count()
Получить результат в виде коллекции словарей
items = Article.objects.values(`id`, `name`)
Получить результат в виде коллекции кортежей
items = Article.objects.values_list(`id`, `name`)
Получить связанные экземпляры моделей в том же запросе.
queryset = Article.objects.select_related(`directory`)
Получить связанные экземпляры моделей в отдельно запросе.
queryset = Article.objects.prefetch_related(`directory`)
Поиск по точному значению.
queryset = Article.objects.filter(id__exact=10)
queryset = Article.objects.filter(id=10)
Поиск по части значения
queryset = Article.objects.filter(name__contains="elo")
Поиск по вхождению в коллекцию или другой запрос.
queryset = Article.objects.filter(id__in=[1, 2, 3])
other_qs = Article.objects.filter(...)
queryset = Article.objects.filter(id__in=other_qs)
Сравнение со значением.
queryset = Article.objects.filter(id__gt=10)
Проверка на присутствие значения.
True
- значения нет (NULL
)False
- есть значение
queryset = Article.objects.filter(parent__isnull=False)