Выбрать главу

# settings.py

DATABASES = {

····'default': {

········'ENGINE': 'django.db.backends.sqlite3',

········'NAME': 'tmp.db',

····}

}

INSTALLED_APPS = ("orm_only",)

SECRET_KEY = "A secret key may also be required."

Каждая абстрагированная таблица в Django ORM является подклассом объекта Django Model. Это выглядит так:

Отношение ForeignKey обозначает отношение «многие-к-одному» — покупатель может сделать много покупок, но покупка связана с одним покупателем. Используйте OneToOneField для создания отношения «один-к-одному».

Используйте ManyToManyField для записи отношения многие-ко-многим.

Далее нужно выполнить команду для сборки таблиц. Активизировав виртуальную среду, в командной строке перейдите в каталог, где находится файл manage.py, и введите следующий код:

(venv)$ python manage.py migrate

После создания таблиц следует добавить данные в базу. Без использования метода instance.save() данные из новой строки не попадут в базу данных:

Чтобы попасть в базу данных и чтобы вы могли ссылаться на другие объекты, объекты должны быть сохранены.

Вы должны добавлять объекты, состоящие в отношениях «многие-ко-многим», отдельно.

Создание запросов с помощью ORM в Django выглядит так:

В Django оператор для фильтрации (gt, greater than — «больше») добавляется после двойного нижнего подчеркивания к атрибуту таблицы purchase_date (Django анализирует его за кулисами).

Двойное нижнее подчеркивание после идентификатора внешнего ключа предоставит доступ к атрибуту соответствующей таблицы.

В случае если вы не видели нотации, можете поместить в скобки длинное выражение и разбить его на несколько строк для удобочитаемости.

Блок annotate набора запросов добавляет дополнительные поля к каждому результату.

peewee

Основная цель peewee (http://docs.peewee-orm.com/en/latest/) — предоставить тем, кто знает SQL, легковесный способ взаимодействия с базой данных. Что вы видите, то и получаете (вы не будете разрабатывать вручную верхний уровень, который создает абстрактную структуру таблиц за кулисами, как SQLAlchemy; библиотека также не будет волшебным образом создавать нижний уровень под вашими таблицами вроде Django ORM). Ее цель заключается в том, чтобы заполнить другую нишу, — выполнять небольшое количество задач, но работать быстро, просто и по-питонски.

Здесь нет почти ничего «волшебного» за исключением создания первичных ключей для таблиц в том случае, если этого не сделал пользователь. Вы можете создать таблицу следующим образом:

peewee хранит детали конфигурации в пространстве имен Meta, эта идея заимствована у Django.

Связываем каждый объект типа Model с базой данных.

Первичный ключ будет добавлен неявно, если вы не сделаете этого самостоятельно.

Эта строка добавляет атрибут purchases к записям Customer для упрощения доступа, но ничего не делает с таблицами.

Инициализируем данные и добавляем их в базу данных за один шаг с помощью метода create() или же сначала инициализируем их, а затем добавим (существуют настройки конфигурации для управления автоматической отправкой транзакций и вспомогательными программами для них). Это делается за один этап:

Добавьте объект (вроде cat) — и peewee будет использовать его первичный ключ.

В отношении «многие-ко-многим» нет ничего волшебного — просто добавьте новые записи вручную.

Пример запроса выглядит так:

>>> for p in Purchase.select(). where(Purchase.purchase_date > d — 1 * day):

… ····print(p.customer.name, p.purchase_date)

Douglas 1971-12-18

Cat 1971-12-19

>>>

>>> from peewee import fn

>>> q = (Cheese

… ····.select(Cheese.kind, fn.COUNT(Purchase.id). alias('num_purchased'))

… ····.join(PurchaseCheese)

… ····.join(Purchase)

… ····.group_by(Cheese.kind)

…)

>>> for chz in q:

… ····print(chz.kind, chz.num_purchased)

Camembert 2