Описание тега django-models
Центральным элементом схемы объектно-реляционного сопоставления Django является модель. Модель - это единственный исчерпывающий источник информации о ваших данных. Он содержит основные поля и поведение данных, которые вы храните. Как правило, каждая модель сопоставляется с одной таблицей базы данных способом, который в основном не связан с деталями реализации выбранной базы данных, зависящими от поставщика.
Основы:
- Каждая модель представляет собой класс Python, который наследует
django.db.models.Model
. - Экземпляры моделей соответствуют строкам таблицы.
- Модели содержат атрибуты полей, соответствующие столбцам таблицы.
- Методы модели соответствуют запросам SQL и процедурам для этих запросов.
- Аргументы полей модели и атрибуты внутренних классов Meta соответствуют свойствам DDL в базовых таблицах базы данных.
Django наделяет модели автоматически сгенерированным API доступа к базе данных, который в большинстве случаев позволяет получать доступ к данным и изменять их в парадигме Pythonic, в отличие от написания сырого SQL.
Изменение формата ваших моделей (то есть изменение полей ваших моделей или добавление новых моделей, в отличие от добавления или изменения экземпляров модели) известно как миграция схемы.
Помимо определения реляционной схемы ваших данных, стандартной практикой кодирования приложений Django является включение бизнес-логики для запросов и действий в сущностях вашей модели в классы модели (для операций на уровне экземпляра или строки) и в связанных Менеджерах (для операций на уровне класса или таблицы).
Некоторые примеры
Существует "тупой" способ извлечения данных из базы данных в представлении. Это просто: просто используйте любую существующую библиотеку Python для выполнения запроса SQL и сделайте что-нибудь с результатами.
Это достигается за счет использования MySQLdb для подключения к базе данных MySQL, получения некоторых записей и передачи их в шаблон для отображения в виде веб-страницы:
from django.shortcuts import render
import MySQLdb
def book_list(request):
db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
cursor = db.cursor()
cursor.execute('SELECT name FROM books ORDER BY name')
names = [row[0] for row in cursor.fetchall()]
db.close()
return render(request, 'book_list.html', {'names': names})
Такой подход работает, но некоторые проблемы должны сразу броситься в глаза:
- Мы жестко кодируем параметры подключения к базе данных. В идеале эти параметры должны храниться в конфигурации Django.
- Нам нужно написать довольно много шаблонного кода: создание соединения, создание курсора, выполнение оператора и закрытие соединения. В идеале все, что нам нужно сделать, это указать, какие результаты мы хотим.
- Это связывает нас с MySQL. Если в будущем мы переключимся с MySQL на PostgreSQL, нам придется использовать другой адаптер базы данных (например, psycopg, а не MySQLdb), изменить параметры подключения и, в зависимости от характера оператора SQL, возможно, переписать SQL. В идеале, сервер базы данных, который мы используем, должен быть абстрактным, чтобы изменение сервера базы данных можно было производить в одном месте. (Эта функция особенно актуальна, если вы создаете приложение Django с открытым исходным кодом, которое хотите использовать как можно большему количеству людей.)
Как и следовало ожидать, уровень базы данных Django направлен на решение этих проблем. Вот предварительный просмотр того, как предыдущее представление можно переписать с помощью API базы данных Django:
from django.shortcuts import render
from mysite.books.models import Book
def book_list(request):
books = Book.objects.order_by('name')
return render(request, 'book_list.html', {'books': books})
Ссылки: