Django book: ваша первая модель

By | 02/27/2015
 

django_logo_2Предыдущая часть.

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