Spec-Zone.ru › Django 5.2

Фикстуры

Фикстура — это набор файлов, содержащих сериализованное содержимое базы данных. Каждая фикстура имеет уникальное имя, а файлы, составляющие фикстуру, могут быть распределены по нескольким каталогам в нескольких приложениях.

См. также

  • Как предоставить начальные данные для моделей

Как создать фикстуру

Фикстуры могут быть сгенерированы с помощью manage.py dumpdata. Также можно создать пользовательские фикстуры, напрямую используя инструменты сериализации или даже написав их вручную.

Как использовать фикстуру

Фикстуры могут использоваться для предварительной загрузки базы данных данными для тестов:

class MyTestCase(TestCase):
    fixtures = ["fixture-label"]

или для предоставления некоторых начальных данных с помощью команды loaddata:

django-admin loaddata <fixture label>

Как обнаруживаются фикстуры

Django будет искать фикстуры в следующих местах:

  1. В каталоге fixtures каждого установленного приложения
  2. В любом каталоге, указанном в настройке FIXTURE_DIRS
  3. В буквальном пути, указанном для фикстуры

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

django-admin loaddata mydata.json

будет загружать только JSON фикстуры, названные mydata. Расширение фикстуры должно соответствовать зарегистрированному имени сериализатора (например, 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.

Порядок загрузки фикстур

Можно указать несколько фикстур в одном вызове. Например:

django-admin loaddata mammals birds insects

или в классе тестового случая:

class AnimalTestCase(TestCase):
    fixtures = ["mammals", "birds", "insects"]

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

В этих примерах сначала будут загружены все фикстуры, названные mammals из всех приложений (в порядке, в котором приложения определены в INSTALLED_APPS). Затем будут загружены все birds фикстуры, за которыми следуют все insects фикстуры.

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

Как фикстуры сохраняются в базе данных

При обработке файлов фикстур данные сохраняются в базе данных как есть. Определенные в модели методы 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.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/topics/db/fixtures/

Spec-Zone.ru

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