Предыдущая часть.
В качестве примере в этой и следующих главах – мы будем использовать модель данных книга/автор/издатель (book/author/publisher). Мы используем её, так как связи между книгой, автором и издателем хорошо всем известны, и это достаточно распространённая модель, используемая в учебниках по SQL.
Мы предлагаем следующие понятия, поля и связи:
- У автора есть имя, фамилия и адрес электронной почты.
- У издателя есть имя, почтовый адрес, город, штат, страна и адрес веб-сайта.
- Книга имеет заголовок и дату издания. Так же, есть один или больше авторов (many-to-many связи с авторами) и один издатель (связь one-to-many – как foreign key с издателями).
Первый шаг в использовании этой схемы базы данных – выразить её в коде Python. В файле models.py
, который был создан после выполнения команды startapp
, введите следующий код:
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
Давайте кратко рассмотрим его, что бы понять основные моменты. Первое – каждая модель представлена классом Python, который является наследником класса django.db.models.Model
. Родительский класс Model
содержит всю структуру, необходимую для того, что бы эти модели могли взаимодействовать с самой базой данных, и всё, что требуется от наших моделей – это описание полей в красивом и компактном виде. Верите или нет – это всё, что надо написать для того, что бы получить доступ к данным из Django.
Каждая модель относится к отдельной таблице базы данных, а каждый атрибут – колонке в таблице базы. Имя атрибута соответствует имени колонки, а тип поля (например – CharField
) – типу колонки в базе данных (например – varchar
). Если представить модель Publisher
в виде запроса CREATE TABLE
для PostgreSQL – он бы выглядел так:
CREATE TABLE "books_publisher" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(30) NOT NULL, "address" varchar(50) NOT NULL, "city" varchar(60) NOT NULL, "state_province" varchar(30) NOT NULL, "country" varchar(50) NOT NULL, "website" varchar(200) NOT NULL );
Django же может создать этот запрос автоматически, и мы скоро покажем как.
Исключение из правила один-класс-на-таблицу-базы (one-class-per-database-table) – это случай связи многое-со-многим (many-to-many). В нашем примере моделей, класс Book
содержит атрибут authors
с типом ManyToManyField
. Это указывает, что книга имеет одного или нескольких авторов, но таблица Book
не будет содержать колонку authors
. Вместо этого – Django создаст отдельную таблицу – many-to-many “join table” – которая будет связывать книги и авторов.
Полный список типов полей и опции синтаксиса моделей смотрите в приложении В.
Напоследок, обратите внимание, что мы не указали явно primary key ни в одной из наших моделей. Если вы не указываете другое явным образом – Django автоматически добавит каждой модели поле id с автоинкрементом, которое будет играть роль первичного ключа. Каждая модель обязательно должна имя иметь такую колонку с первичным ключом.
Продолжение – Django book: установка модели.