Как загрузить светильники Django из всех приложений? - PullRequest
4 голосов
/ 02 марта 2011

Я использую приборы в своем приложении Django, но только два приложения загружают свои приборы.

Когда я вручную запускаю loaddata с параметром --verbosity = 2, я вижу, что он просматривается только в двух приложениях, хотя у меня есть еще каталоги с приспособлениями, созданные внутри.

Все приложения правильно установлены в settings.py.

Из документации видно, что Django должен искать в каталоге fixtures / каждого установленного приложения.

Есть идеи, почему некоторые приложения игнорируются?

Ответы [ 4 ]

5 голосов
/ 31 мая 2011

Initial_data импортируется каждый раз, когда вы делаете syncdb.Насколько я помню, он также перезаписывает любые изменения, которые вы сделали вручную.

Чтобы загрузить другие приборы, вы должны использовать manage.py loaddata имя прибора.Это хорошо работает, если вы используете общую схему именования во всех своих приложениях.Если вы этого не сделаете, вы должны дать loaddata имя каждого из них или использовать find, чтобы получить список приборов и exec loaddata в каждом из них:

EDIT: (как я добавляю manage.pyв / bin в virtualenv, когда я устанавливаю пакет django, я использую только manage.py, если вам не нужен python manage.py loaddata, конечно)

find . -name "*.json" -exec manage.py loaddata {} \;

Я использую это в fabfileдля автоматизации постановочных инсталляций:

def load_all_fixtures():
    """Loads all the fixtures in every dir"""
    with cd(env.directory):
        run("""
            source /usr/local/bin/virtualenvwrapper.sh &&
            workon %s &&
            find -L . -name "*.json" -exec manage.py loaddata {} \;

            """ % env.virtualenv )
4 голосов
/ 21 мая 2014

Попробуйте позвонить так

python manage.py loaddata initial_data

ИЛИ программно вы можете назвать это как

from django.core.management import call_command
call_command('loaddata', 'initial_data', verbosity=3, database='default')
3 голосов
/ 28 июня 2014

Проблема в том, что Django ищет приборы только в приложениях, которые предоставляют модель .Вероятно, у вас есть приложение, которое не имеет модели, но вы все еще хотите загрузить некоторые приборы (возможно, образцы данных для другого установленного приложения).

Причиной такого поведения в Django является get_apps() в loaddata.py:

  1. django.core.management.commands.loaddata , строка 102
  2. django.db.models.loading , строка 132

Чтобы обмануть Django и посмотреть папку <app>/fixtures/ вашего приложения, вы должны добавить в приложение (пустой) файл models.py.(Будьте добры и добавьте комментарий в этот файл, чтобы все прояснилось!)

/ models.py

"""
No real model, just an empty file to make Django load the fixtures.
"""

После этого запустите python manage.py loaddata <fixture>вручную найдет файл фиксации вашего приложения.

2 голосов
/ 02 марта 2011

Вы должны поместить данные прибора в файл initial_data. [Json | xml, ...].

Я думаю, что по умолчанию загружаются только эти файлы.

AppDir / приборы / initial_data.json

...