Spec-Zone.ru › Django 1.8

Предоставление начальных данных для моделей

Иногда бывает полезно предварительно заполнить базу данных жестко закодированными данными при первом настройке приложения. Есть несколько способов, с помощью которых Django может автоматически создать эти данные: вы можете предоставить начальные данные через фикстуры, или вы можете предоставить начальные данные в виде SQL.

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

Предоставление начальных данных с помощью фикстур

Фикстура — это набор данных, которые Django знает, как импортировать в базу данных. Самый простой способ создания фикстуры, если у вас уже есть некоторые данные, — использовать команду manage.py dumpdata. Или вы можете написать фикстуры вручную; фикстуры могут быть написаны в формате JSON, XML или YAML (при установленной библиотеке PyYAML). В документации по сериализации содержатся более подробные сведения о каждом из поддерживаемых форматах сериализации.

В качестве примера, вот как может выглядеть фикстура для простой Person модели в формате JSON:

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Paul",
      "last_name": "McCartney"
    }
  }
]

И вот та же фикстура в формате YAML:

- model: myapp.person
  pk: 1
  fields:
    first_name: John
    last_name: Lennon
- model: myapp.person
  pk: 2
  fields:
    first_name: Paul
    last_name: McCartney

Вы будете хранить эти данные в каталоге fixtures внутри вашего приложения.

Загрузка данных проста: просто вызовите manage.py loaddata <fixturename>, где <fixturename> — имя созданного файла фикстуры. Каждый раз, когда вы запускаете loaddata, данные будут считываться из фикстуры и повторно загружаться в базу данных. Обратите внимание, что это означает, что если вы измените одну из строк, созданных фикстурой, а затем снова запустите loaddata, все внесенные изменения будут потеряны.

Автоматическая загрузка начальных фикстур данных

Устарело начиная с версии 1.7: Если приложение использует миграции, автоматическая загрузка фикстур отсутствует. Поскольку миграции будут необходимы для приложений в Django 1.9, это поведение считается устаревшим. Если вы хотите загрузить начальные данные для приложения, рассмотрите возможность сделать это в миграции данных.

Если вы создадите фикстуру с именем initial_data.[xml/yaml/json], эта фикстура будет загружаться каждый раз при запуске migrate. Это очень удобно, но будьте осторожны: помните, что данные будут обновляться при каждом запуске migrate. Поэтому не используйте initial_data для данных, которые вы хотите редактировать.

Где Django находит файлы фикстур

По умолчанию Django ищет фикстуры в каталоге fixtures внутри каждого приложения. Вы можете установить значение настройки FIXTURE_DIRS в список дополнительных каталогов, где Django должен искать.

При запуске manage.py loaddata вы также можете указать путь к файлу фикстуры, что переопределяет поиск в стандартных каталогах.

См. также

Фикстуры также используются фреймворком тестирования для настройки согласованной тестовой среды.

Предоставление начальных данных SQL

Устарело начиная с версии 1.7: Если приложение использует миграции, начальные данные SQL (включая специфичные для бэкенда данные SQL) не загружаются. Поскольку миграции будут необходимы для приложений в Django 1.9, это поведение считается устаревшим. Если вы хотите использовать начальные данные SQL для приложения, рассмотрите возможность сделать это в миграции данных.

Django предоставляет возможность передать базе данных произвольный SQL, который выполняется сразу после операторов CREATE TABLE при запуске migrate. Вы можете использовать этот механизм для заполнения записей по умолчанию или для создания SQL-функций, представлений, триггеров и т. д.

Этот механизм прост: Django ищет файл с именем sql/<modelname>.sql, в каталоге вашего приложения, где <modelname> — имя модели в нижнем регистре.

Итак, если у вас есть Person модель в приложении под названием myapp, вы можете добавить произвольный SQL в файл sql/person.sql в вашем каталоге myapp. Вот пример того, что может содержать файл:

INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');

Ожидается, что каждый файл SQL, если он предоставлен, будет содержать допустимые операторы SQL, которые будут вставлять желаемые данные (например, правильно отформатированные операторы INSERT разделенные точкой с запятой).

Файлы SQL считываются командами sqlcustom и sqlall в manage.py. Дополнительную информацию см. в документации manage.py.

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

Начальные данные SQL и тестирование

Этот метод не может использоваться для предоставления начальных данных для целей тестирования. Фреймворк тестирования Django очищает содержимое тестовой базы данных после каждого теста; в результате любые данные, добавленные с помощью пользовательского SQL-механизма, будут потеряны.

Если вам нужны данные для тестового случая, вы должны добавить их с помощью фикстуры для тестирования или программно добавить их во время setUp() вашего тестового случая.

Данные SQL, специфичные для бэкенда базы данных

Есть также механизм для данных SQL, специфичных для бэкенда. Например, вы можете иметь отдельные файлы начальных данных для PostgreSQL и SQLite. Для каждого приложения Django ищет файл с именем <app_label>/sql/<modelname>.<backend>.sql, где <app_label> — это каталог вашего приложения, <modelname> — имя модели в нижнем регистре и <backend> — последняя часть имени модуля, предоставленного для ENGINE в вашем файле настроек (например, если вы определили базу данных со значением ENGINE django.db.backends.sqlite3, Django будет искать <app_label>/sql/<modelname>.sqlite3.sql).

Данные SQL, специфичные для бэкенда, выполняются до данных SQL, не специфичных для бэкенда. Например, если ваше приложение содержит файлы sql/person.sql и sql/person.sqlite3.sql и вы устанавливаете приложение на SQLite, Django сначала выполнит содержимое sql/person.sqlite3.sql, а затем sql/person.sql.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/howto/initial-data/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API