Предыдущая часть.
В качестве примере в этой и следующих главах — мы будем использовать модель данных книга/автор/издатель (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: установка модели.