2010-12-09 2 views
5

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

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

ответ

0

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

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

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

+0

Да, но эти светильники не загружаются автоматически на syncdb ... – priestc 2010-12-09 18:35:33

+0

nbv4: Я обнаружил, что наиболее удобным способом решения этой проблемы при разработке является создание сценария сброса базы данных, который сначала очистит базу данных (базу данных зависимые), затем создавать структуры базы данных (syncdb) и, наконец, загружать приборы (loaddata). – vls 2010-12-09 18:39:02

9

По моему опыту, жестко закрепленные светильники - это боль, которую нужно написать, и боль для поддержания. В тех случаях, когда изменение модели нарушает привязку, первоначальная загрузка 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 автоматически создает для вас любые зависимости, которые необходимы для существования модели книги. Это простой пример, но библиотека может обрабатывать очень сложные структуры модели.

2

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

См: https://docs.djangoproject.com/en/1.3/ref/signals/#post-syncdb

0

Hacky способ загрузить дополнительную initial_data.json или два, чтобы создать дополнительные пустые приложения в вашем проекте Django, который не имеет ничего, кроме приборов папки и файла 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 и нужно иметь возможность управлять заказом, в который они загружены, это работает.

 Смежные вопросы

  • Нет связанных вопросов^_^