В качестве постоянного примера в этой и следующих главах мы сосредоточимся на простом формате данных: книга, автор, издатель. Мы используем это в качестве нашего примера, потому что концептуальные взаимоотношения между этими понятиями широко известны и потому что этот общий формат данных используется в книгах по SQL. Вы также читаете книгу, которая создана авторами и напечатана издателем!
Мы предположим следующие концепции, поля и взаимоотношения:
Автор имеет звание (господин, госпожа, товарищ), имя, фамилию, адрес электронной почты и фотографию.
Издатель имеет имя, адрес, город, область, страну и сайт.
Книга имеет название и дату издания. Она также имеет одного или нескольких авторов (с авторами отношение многие-ко-многим) и одного издателя (отношение один-к-многим, как внешний ключ, к издателям).
Первым шагом в использовании этой схемы базы данных будет её
выражение в виде кода 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):
salutation = models.CharField(max_length=10)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
headshot = models.ImageField(upload_to='/tmp')
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
эквивалентна следующей таблице
(в синтаксисе для 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 может сгенерировать такой оператор CREATE TABLE автоматически, мы это скоро покажем.
Исключением из правила «один класс для одной таблицы» является случай отношения «многие-ко-многим». В нашем примере Book имеет такое поле — authors. Это означает, что книга имеет одного или более авторов, но таблица Book не получает такого столбца, Django создаёт дополнительную таблицу, которая применяется для обеспечения этой функциональности.
Полный список типов полей и опций синтаксиса моделей приведены в Приложении «Справочник определений модели».
Наконец, следует отметить, что мы нигде явно не определяли первичные ключи. Если специально не запрещать, то Django автоматически создаёт поле id для таблицы каждой модели. Необходимо, чтобы каждая модель Django имела первичный ключ, созданный по одному полю.
Пред. | Уровень выше | След. |
Определение моделей в Python | Начало | Установка модели |
2 comments | Make a comment
Сразу не получилось.
validate выдал, что не установлена библиотека PIL, которая нужна для типа ImageField. И сказал, что надо взять отсюда - http://www.pythonware.com/products/pil/
Скачал. Установил. Всё заработало.
Промазал разделом. Комментарий относится к следующему разделу "Установка модели"