Есть ли в любом случае для загрузки одного прибора и загрузки нескольких приборов?
В идеале хотелось бы ввести:
python manage.py loaddata all_fixtures
И загрузите все данные вместо того, чтобы набирать все. Возможно ли это?
Есть ли в любом случае для загрузки одного прибора и загрузки нескольких приборов?
В идеале хотелось бы ввести:
python manage.py loaddata all_fixtures
И загрузите все данные вместо того, чтобы набирать все. Возможно ли это?
Использование $ python manage.py loaddata myfixtures/*.json
будет работать, поскольку Bash заменит подстановочный знак на список совпадающих имен файлов.
Почему бы не создать 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
(Такой подход также хорош для выполнения модульных тестов для определенных приложений и игнорирования других, если это необходимо)
У меня есть несколько приложений в каталоге проектов, и у каждого приложения есть его каталог "fixtures". Поэтому, используя некоторые bash, я могу сделать:
python3 manage.py loaddata */fixtures/*.json
И это расширяет все json файлы внутри каталога приборов в каждом приложении в моем проекте. Вы можете проверить это, просто сделав:
ls */fixtures/*.json
Этот поток показывается в числе первых результатов поиска 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']
Если вы хотите иметь эту работу в 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)
Manage.py loaddata будет автоматически смотреться в определенных местах, поэтому, если вы назовите свои светильники одинаковыми в каждом приложении или поместите все ваши светильники в одной папке могут быть легко загружены. Если у вас много разных светильников и вам нужна более сложная схема именования, вы можете легко загрузить все свои приборы, используя find -exec
найти. -name "*.json" -exec manage.py loaddata {} \;
Как я заявляю в этом [question][2]
, у меня также есть это в fabfile. EDIT: используйте python manage.py, если manage.py не находится в вашем пути VE.
Моя команда такая простая. (django 1.6)
python manage.py loaddata a.json b.json c.json
После небольшого поиска я закончил писать этот 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))
Это хорошо работает для меня; он находит все файлы, расположенные в каталогах fixtures
каталоге src
:
python manage.py loaddata \
$(ls -1 src/**/fixtures/* | tr '\n' '\0' | xargs -0 -n 1 basename | tr '\n' ' ')