Загрузите несколько приборов одновременно - PullRequest
13 голосов
/ 09 февраля 2010

Есть ли способ загрузить один прибор и загрузить несколько приборов?

В идеале я хотел бы напечатать:

python manage.py loaddata all_fixtures

И загрузите все данные вместо того, чтобы вводить все. Это возможно?

Ответы [ 9 ]

26 голосов
/ 09 февраля 2010

Использование $ python manage.py loaddata myfixtures/*.json будет работать, поскольку Bash заменит подстановочный знак в списке совпадающих имен файлов.

11 голосов
/ 14 мая 2015

У меня есть несколько приложений в каталоге проекта, и каждое приложение имеет свой каталог 'fixtures'. Таким образом, используя некоторый bash, я могу сделать:

python3 manage.py loaddata */fixtures/*.json

И это расширяет все файлы json внутри каталога fixtures для каждого приложения в моем проекте. Вы можете проверить это, просто выполнив:

ls */fixtures/*.json

10 голосов
/ 09 февраля 2010

Почему бы не создать Makefile, который будет использовать все ваши приборы? например что-то вроде:

load_all_fixtures: 
    ./manage.py loaddata path/to/fixtures/foo.json
    ./manage.py loaddata path/to/fixtures/bar.json
    ./manage.py loaddata path/to/fixtures/baz.json

А затем по приглашению оболочки запустите

make load_all_fixtures

(Этот подход также хорош для выполнения модульных тестов только для определенных приложений и игнорирования других, если это необходимо)

9 голосов
/ 16 октября 2017

Эта тема показывается в числе первых результатов поиска Google «загрузить данные из всех приборов» и не упоминает, какое IMO является правильным решением для этого, то есть решение, которое позволяет загружать любые приборы, которые вы хотите без каких-либо подстановочных знаков, ни единой модификации файла settings.py (я тоже так делал)

Просто сделайте каталоги приспособлений ваших приложений плоскими (а не обычной схемой Django, которая, например, выглядит как app_name / templates / app_name / mytemplate.html), то есть app_name / fixtures / myfixture. [Json, yaml, xml]

Вот что говорит django doc :

Например:

django-admin loaddata foo/bar/mydata.json

будет искать /fixtures/foo/bar/mydata.json для каждого установленного приложения, /foo/bar/mydata.json для каждого каталога в FIXTURE_DIRS и по буквальному пути foo / bar / mydata.json.

Это означает, что если у вас есть fixtures / myfixture.json во всех каталогах ваших приложений, вам просто нужно запустить

./manage.py loaddata myfixture

чтобы загрузить все приборы, которые находятся там в вашем проекте ... И это все! Вы даже можете ограничить, из каких приложений вы загружаете приборы, используя аргументы --app или --exclude.

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

class MyTestCase(TestCase):
    fixtures = ['app_name/fixtures/myfixture.json']
2 голосов
/ 25 февраля 2012

Если вы хотите, чтобы это работало на Linux и Windows, вы просто можете использовать это для загрузки всех ваших json-Fixtures:

import os
files = os.listdir('path/to/my/fixtures')

def loaddata(file):
    if os.path.splitext(file)[1] == '.json' and file != 'initial_data.json':
        print file
        os.system("python manage.py loaddata %s" % file)

map(loaddata, files)
0 голосов
/ 25 января 2019

Это хорошо работает для меня; он находит все файлы, расположенные в каталогах fixtures в каталоге src:

python manage.py loaddata \
    $(ls -1 src/**/fixtures/* | tr '\n' '\0' | xargs -0 -n 1 basename | tr '\n' ' ')
0 голосов
/ 16 ноября 2017

После небольшого поиска я закончил писать этот скрипт. Он просматривает все каталоги с именем «fixtures» для файлов .json и запускает «python manage.py loaddata {fixture_name} .json». Иногда порядок имеет значение для ограничений внешнего ключа, поэтому он оставляет фиксатор в очереди, если ограничение не может быть разрешено.

(Примечание. Для этого требуется пакет pip simple_terminal, который я написал. И я настроил его для запуска с помощью 'python manage.py runcript', который требует django-extension.)

# load_fixture.py
#
# A script that searches for all .json files in fixtures directories
# and loads them into the working database. This is meant to be run after
# dropping and recreating a database then running migrations.
#
# Usage: python manage.py runscript load_fixtures

from simple_terminal import Terminal

from django.core.management import call_command
from django.db.utils import IntegrityError


def load_fixture(fixture_location):
    # runs command: python manage.py loaddata <fixture_location>
    call_command('loaddata', fixture_location)


def run():
    with Terminal() as t:
        # get all .json files in a fixtures directory
        fixture_locations = t.command(
            'find . -name *.json | grep fixtures | grep -v env')

    while fixture_locations:
        # check that every iteration imports are occuring
        errors = []
        length_before = len(fixture_locations)

        for fl in fixture_locations:
            try:
                # try to load fixture and if loaded remove it from the array
                load_fixture(fl)
                print("LOADED: {}".format(fl))
                fixture_locations.remove(fl)
            except IntegrityError as e:
                errors.append(str(e))

        # if import did not occur this iteration raise exception due to
        # missing foreign key reference
        length_after = len(fixture_locations)
        if length_before == length_after:
            raise IntegrityError(' '.join(errors))
0 голосов
/ 20 июня 2014

Моя команда такая простая. (Джанго 1.6)

python manage.py loaddata a.json b.json c.json
0 голосов
/ 31 мая 2011

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

найти. -name "* .json" -exec manage.py loaddata {} \;

Как я утверждаю в этом [question][2], у меня также есть это в fabfile. РЕДАКТИРОВАТЬ: используйте python manage.py, если manage.py не находится на вашем пути VE.

...