По вопросам использования модельного класса из веб-фреймворка Django.

Центральным элементом схемы объектно-реляционного отображения Django является модель. Модель является единственным источником информации о ваших данных. Он содержит основные поля и поведение данных, которые вы храните. Как правило, каждая модель сопоставляется с одной таблицей базы данных способом, который в основном не связан с подробностями реализации выбранной базы данных, зависящими от поставщика.

Основы:

  • Каждая модель представляет собой класс Python, который подклассов django.db.models.Model.
  • Экземпляры моделей соответствуют строкам таблицы.
  • Модели содержат атрибуты полей, которые соответствуют столбцам таблицы.
  • Методы модели соответствуют SQL-запросам и процедурам по этим запросам.
  • Аргументы для моделирования полей и атрибутов внутренних метаклассов соответствуют свойствам 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})

Рекомендации: