1つのフィクスチャをロードして複数のフィクスチャをロードする方法はありますか?
理想的には次のように入力します。
python manage.py loaddata all_fixtures
そして、すべてを入力する代わりに、すべてのデータをロードするようにします。これは可能ですか?
1つのフィクスチャをロードして複数のフィクスチャをロードする方法はありますか?
理想的には次のように入力します。
python manage.py loaddata all_fixtures
そして、すべてを入力する代わりに、すべてのデータをロードするようにします。これは可能ですか?
$ python manage.py loaddata myfixtures/*.json
Bashはワイルドカードを一致するファイル名のリストに置き換えるため、を使用すると機能します。
プロジェクトディレクトリに複数のアプリがあり、各アプリに「フィクスチャ」ディレクトリがあります。だから私ができるいくつかのbashを使用して:
python3 manage.py loaddata */fixtures/*.json
これで、プロジェクトの各アプリのフィクスチャディレクトリ内にあるすべてのjsonファイルが展開されます。次の手順を実行するだけでテストできます。
ls */fixtures/*.json
すべてのフィクスチャを取り込む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
(この種のアプローチは、特定のアプリに対してのみ単体テストを実行し、必要に応じて他のアプリを無視する場合にも適しています)
このスレッドは、Google検索の「すべてのフィクスチャからデータをロードする」の最初の結果に表示され、IMOがこれに対する正しいソリューション、つまりワイルドカードのトリックなしで必要なフィクスチャをロードできるソリューションについては言及していません。 settings.pyファイルの1つの変更(私もこの方法で行っていました)
アプリのフィクスチャディレクトリをフラットにします(たとえば、app_name / templates / app_name / mytemplate.htmlになる通常のDjangoスキームではありません)。つまり、app_name / fixedtures / myfixture。[json、yaml、xml]
djangoドキュメントの内容は次のとおりです。
例えば:
django-admin loaddata foo/bar/mydata.json
インストールされている各アプリケーションの/fixtures/foo/bar/mydata.json、FIXTURE_DIRSの各ディレクトリの/foo/bar/mydata.json、およびリテラルパスfoo / bar/mydata.jsonを検索します。
つまり、すべてのアプリディレクトリにfixtures / myfixture.jsonがある場合は、実行するだけで済みます。
./manage.py loaddata myfixture
プロジェクト内にあるすべてのフィクスチャをロードするには...そしてそれだけです!--appまたは--exclude引数を使用して、フィクスチャをロードするアプリを制限することもできます。
いくつかの開発中にデータベースにデータを入力するためだけにフィクスチャを使用するので、「フィクスチャ」ディレクトリにフラットな構造を持っていてもかまいません...しかし、フィクスチャをテストに使用しても、フラットな構造はDjango風の方法であり、 その答えが示すように、次のように記述するだけで、特定のアプリからフィクスチャを参照できます。
class MyTestCase(TestCase):
fixtures = ['app_name/fixtures/myfixture.json']
私の命令はこれです、簡単です。(django 1.6)
python manage.py loaddata a.json b.json c.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)
Django-adminバージョン3.1.4で動作します
python manage.py loaddata json_file_1 json_file_2
私のフォルダ構造はこんな感じです-
app_name_1
├──fixtures
├────json_file_1.json
├────json_file_2.json
app_name_2
├──fixtures
├────json_file_3.json
Manage.py loaddataは特定の場所で自動的に表示されるため、各アプリでフィクスチャに同じ名前を付けるか、すべてのフィクスチャを同じフォルダに配置すると、すべてを簡単にロードできます。多くの異なるフィクスチャがあり、より複雑な命名スキーマが必要な場合は、findwith-execを使用してすべてのフィクスチャを簡単にロードできます。
探す 。-name "* .json" -exec manage.py loaddata {} \;
これで述べて[question][2]
いるように、これもfabfileにあります。編集:manage.pyがVEパスにない場合は、pythonmanage.pyを使用してください。
ls
フィクスチャが同じフォルダにある場合は、次のようにすることができxargs
ますls myfolder | xargs django-admin loaddata
。
この構造の例:
$ tree fixtures/
root_dir/fixtures/
├── 1_users.json
├── 2_articles.json
└── 3_addresses.json
$ ls -d fixtures/* | xargs django-admin loaddata
同じことをします:
$ django-admin loaddata 1_users.json
$ django-admin loaddata 2_articles.json
$ django-admin loaddata 3_addresses.json
少し検索した後、私はこのスクリプトを書くことになりました。「fixtures」という名前のすべてのディレクトリで.jsonファイルを検索し、「python manage.py loaddata{fixture_name}.json」を実行します。外部キー制約の順序が重要になる場合があるため、制約を解決できない場合は、フィクスチャがキューに残ります。
(注:私が作成したpipパッケージsimple_terminalが必要です。また、django-extensionsが必要な'python manage.py runscript'で実行されるように設定しました。)
# 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' ' ')
python manage.py loaddata ./*/fixtures/*.json
このコマンドは、すべてのディレクトリでフォルダを検索し、拡張子がfixture
付いたすべてのファイルを取得して、フィクスチャをインストールします。json
このように、フィクスチャ用のフォルダを1つだけにする必要はありません。代わりに、アプリレベルおよび複数のアプリにフィクスチャを含めることができます。
このような理想的なフォルダ構造で動作します-
app_name_1
├──fixtures
├────json_file_1.json
├────json_file_2.json
app_name_2
├──fixtures
├────json_file_3.json