Приспособления¶
Что такое приспособление?¶
Приспособление fixture - это набор файлов, содержащих сериализованное содержимое базы данных. Каждое приспособление имеет уникальное имя, а файлы, составляющие приспособление, могут быть распределены по нескольким каталогам в нескольких приложениях.
Как изготовить приспособление?¶
Приспособления можно генерировать с помощью manage.py dumpdata
. Также можно генерировать пользовательские приспособления, непосредственно используя инструменты serialization documentation или даже написав их вручную.
Для чего использовать приспособление?¶
Приспособления можно использовать для предварительного заполнения базы данных данными для tests или для предоставления некоторых initial data.
Были ли у Джанго поиски приспособлений?¶
Django будет искать светильники в трех местах:
- В каталоге
fixtures
каждого установленного приложения - В любом каталоге, названном в настройке
FIXTURE_DIRS
. - В буквальном пути, названном приспособлением
Django загрузит все фикстуры, которые найдет в этих местах и которые соответствуют указанным именам фикстур.
Если названное приспособление имеет расширение файла, будут загружены только приспособления этого типа. Например:
django-admin loaddata mydata.json
будет загружать только JSON-фиксаторы с именем mydata
. Расширение приспособления должно соответствовать зарегистрированному имени serializer (например, json
или xml
).
Если вы опустите расширения, Django будет искать подходящее приспособление во всех доступных типах приспособлений. Например:
django-admin loaddata mydata
будет искать любое приспособление любого типа с именем mydata
. Если каталог приспособлений содержит mydata.json
, то это приспособление будет загружено как JSON-приспособление.
Названные приспособления могут включать компоненты каталогов. Эти каталоги будут включены в путь поиска. Например:
django-admin loaddata foo/bar/mydata.json
будет искать <app_label>/fixtures/foo/bar/mydata.json
для каждого установленного приложения, <dirname>/foo/bar/mydata.json
для каждого каталога в FIXTURE_DIRS
, и буквальный путь foo/bar/mydata.json
.
Как приспособления сохраняются в базе данных?¶
Когда файлы приспособлений обрабатываются, данные сохраняются в базе данных как есть. Определенные моделью методы save()
не вызываются, а любые сигналы pre_save
или post_save
будут вызываться с raw=True
, поскольку экземпляр содержит только атрибуты, локальные для модели. Вы можете, например, захотеть отключить обработчики, обращающиеся к связанным полям, которые не присутствуют при загрузке приспособления и в противном случае вызовут исключение:
from django.db.models.signals import post_save
from .models import MyModel
def my_handler(**kwargs):
# disable the handler during fixture loading
if kwargs['raw']:
return
...
post_save.connect(my_handler, sender=MyModel)
Вы также можете написать декоратор для инкапсуляции этой логики:
from functools import wraps
def disable_for_loaddata(signal_handler):
"""
Decorator that turns off signal handlers when loading fixture data.
"""
@wraps(signal_handler)
def wrapper(*args, **kwargs):
if kwargs['raw']:
return
signal_handler(*args, **kwargs)
return wrapper
@disable_for_loaddata
def my_handler(**kwargs):
...
Только имейте в виду, что эта логика будет отключать сигналы при любой десериализации фикстуры, а не только во время loaddata
.
Обратите внимание, что порядок обработки файлов приспособлений не определен. Однако все данные приспособления устанавливаются как одна транзакция, поэтому данные в одном приспособлении могут ссылаться на данные в другом приспособлении. Если бэкэнд базы данных поддерживает ограничения на уровне строк, эти ограничения будут проверяться в конце транзакции.
Сжатые приспособления¶
Фиксики могут быть сжаты в формате zip
, gz
, bz2
, lzma
или xz
. Например:
django-admin loaddata mydata.json
будет искать любой из mydata.json
, mydata.json.zip
, mydata.json.gz
, mydata.json.bz2
, mydata.json.lzma
или mydata.json.xz
. Используется первый файл, содержащийся в сжатом архиве.
Обратите внимание, что если обнаружены два приспособления с одинаковым именем, но разным типом приспособления (например, если mydata.json
и mydata.xml.gz
были найдены в одном каталоге приспособлений), установка приспособления будет прервана, и любые данные, установленные в вызове loaddata
, будут удалены из базы данных.
MySQL с MyISAM и креплениями
Механизм хранения MyISAM в MySQL не поддерживает транзакции или ограничения, поэтому если вы используете MyISAM, вы не получите проверку данных фиксации или откат при обнаружении нескольких файлов транзакций.
Приспособления, специфичные для базы данных¶
Если вы работаете с несколькими базами данных, у вас могут быть данные приспособлений, которые вы хотите загрузить в одну базу данных, но не в другую. В этой ситуации вы можете добавить идентификатор базы данных в имена ваших приспособлений.
Например, если в вашей настройке DATABASES
определена база данных users
, назовите приспособление mydata.users.json
или mydata.users.json.gz
, и приспособление будет загружаться только тогда, когда вы укажете, что хотите загрузить данные в базу данных users
.