Initial_data управление прибором в Django - PullRequest
6 голосов
/ 09 декабря 2010

Проект django, над которым я работаю, содержит массу данных о начальных и начальных данных. По умолчанию кажется, что единственный способ автоматически загружать данные - это иметь файл в папке вашего приложения с именем fixtures, а файл должен иметь имя initial_data.ext (ext - это xml или json или yaml или что-то еще).

Думаю, это действительно непростительно. Я предпочел бы иметь папку с фикстурами, а затем внутри этой папки initial_data, а затем внутри, по одному файлу для каждой модели в этом приложении. Или что-то в этом роде. Возможно ли это сделать в Django сейчас? Или, может быть, какая-то другая схема лучшей организации крепления.

Ответы [ 4 ]

9 голосов
/ 01 июля 2011

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

Один из разработчиков, с которым я работаю, разработал очень хорошую библиотеку для решения этой проблемы, она называется django-dynamic-fixture , и нам действительно это нравится. Вот как это работает:

Предположим, у вас есть эти модели:

class Author(models.Model):
    name = models.CharField()

class Book(models.Model):
    author = models.ForeingKey(Author, required=True)
    title = models.CharField()

Чтобы создать экземпляр книги в своем тесте, все что вам нужно сделать, это

from django_dynamic_fixture import get
from app import Book

class MyTest(TestCase):
    def setUp(self):
        self.book = get(Book)

django-dynamic-fixture автоматически создает для вас любые зависимости, необходимые для существования модели Book. Это простой пример, но библиотека может работать с очень сложными модельными структурами.

2 голосов
/ 05 июля 2011

Вы можете реорганизовать свои исходные данные, как хотите, и затем написать обработчик сигнала post_syncdb, который загружает их.Таким образом, он будет автоматически загружен на syncdb в соответствии с определенной вами логикой.

0 голосов
/ 30 июня 2014

Хакерский способ загрузить дополнительный файл initial_data.json или два - создать дополнительные пустые приложения в вашем проекте Django, в котором нет ничего, кроме папки fixtures и файла initial_data.json.Если вам нужно загрузить прибор перед установками других приложений, вы можете назвать его как aa1.Если вам нужен еще один, вы можете назвать его aa2.Ваша структура каталогов будет выглядеть следующим образом:

aa1/
   fixtures/
      initial_data.json

aa2/
   fixtures/
      initial_data.json

myrealapp/
   fixtures/
      initial_data.json
...

Вам нужно будет добавить приложения в INSTALLED_APPS в settings.py.

Затем вы можете заполнить файлы fixture_data.json произвольнымИнформация о приложении по мере необходимости:

(virtualenv) ./manage.py dumpdata --indent=4 auth > aa1/fixtures/initial_data.json

(virtualenv) ./manage.py dumpdata --indent=4 oauth2 > aa2/fixtures/initial_data.json

(virtualenv) ./manage.py dumpdata --indent=4 myrealapp > myrealapp/fixtures/initial_data.json

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

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

0 голосов
/ 09 декабря 2010

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

Пример: django-admin.py loaddata application/module/model.json

См. loaddata документацию для получения дополнительной информации.

...