Загружать несколько светильников сразу

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

В идеале хотелось бы ввести:

python manage.py loaddata all_fixtures

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

Ответ 1

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

Ответ 2

Почему бы не создать 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

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

Ответ 3

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

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

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

ls */fixtures/*.json

Ответ 4

Этот поток показывается в числе первых результатов поиска 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']

Ответ 5

Если вы хотите иметь эту работу в 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)

Ответ 6

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

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

Как я заявляю в этом [question][2], у меня также есть это в fabfile. EDIT: используйте python manage.py, если manage.py не находится в вашем пути VE.

Ответ 7

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

python manage.py loaddata a.json b.json c.json

Ответ 8

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

(Примечание: для этого требуется пакет pip simple_terminal, который я написал. И я установил его для запуска с помощью "python manage.py runningcript", для чего требуются расширения django.)

# 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))

Ответ 9

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

python manage.py loaddata \
    $(ls -1 src/**/fixtures/* | tr '\n' '\0' | xargs -0 -n 1 basename | tr '\n' ' ')