Описание тега django-models

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

Центральным элементом схемы объектно-реляционного сопоставления 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})

Ссылки: