Первый пример модели Django

Опубликовал: Monday, January 23, 2024 в категории Django | Пока нет комментариев

В этой и в следующей главе мы будем работать с базой данных, хранящей информацию о книгах, авторах и издательствах. Мы решили остановиться на этом примере, потому что концептуальные отношения между книгами, авторами и издательствами хорошо известны и разобраны во многих учебниках по SQL. Да и сейчас вы читаете книгу, которая написана авторами и опубликована издательством!

Мы принимаем следующие допущения:

•          У автора есть имя, фамилия и адрес электронной почты.

•      У издательства есть название, адрес, город, штат или область, страна и адрес в Интернете.

•      У книги есть название и дата публикации, а также один или несколько авторов (отношение многие-ко-многим между книгами и авторами) и единственное издательство (отношение один-ко-многим с издательствами, иначе называемое внешним ключом).

Самый первый шаг при использовании такой структуры базы данных в Django - выразить ее в виде кода на Python. Введите следующий текст в файл models.ру, созданный командой 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()

На примере этого кода рассмотрим основные принципы. Прежде всего, отметим, что любая модель представлена классом, наследующим класс 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, как мы скоро увидим, может сгенерировать команду CREATE TABLE автоматически.

У правила «одна таблица базы данных - один класс» есть исключение, касающееся отношения многие-ко-многим. Так, в модели Book есть поле authors типа ManyToManyField. Это означает, что у книги может быть один или несколько авторов. Однако в таблице Book нет столбца authors. Поэтому Django создает дополнительную таблицу - связующую для отношения многие-ко-многим, - которая и реализует отображение между книгами и авторами.

Полный перечень типов полей и синтаксиса моделей приведен в приложении В.

Наконец, отметим, что ни для одной модели мы не определили явно первичный ключ. Если не указано противное, Django автоматически включает в каждую модель автоинкрементный первичный ключ целого типа - поле id. Любая модель в Django должна иметь первичный ключ ровно по одному столбцу.

Источник: Головатый А., Каплан-Мосс Дж. Django. Подробное руководство, 2-е издание. - Пер. с англ. - СПб.: Символ- Плюс, 2010. - 560 е., ил.

Похожие посты:

Комментировать

Your email address will not be published. Required fields are marked *