# 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