29

1つのフィクスチャをロードして複数のフィクスチャをロードする方法はありますか?

理想的には次のように入力します。

python manage.py loaddata all_fixtures

そして、すべてを入力する代わりに、すべてのデータをロードするようにします。これは可能ですか?

4

12 に答える 12

43

$ python manage.py loaddata myfixtures/*.jsonBashはワイルドカードを一致するファイル名のリストに置き換えるため、を使用すると機能します。

于 2010-02-09T12:50:32.357 に答える
25

プロジェクトディレクトリに複数のアプリがあり、各アプリに「フィクスチャ」ディレクトリがあります。だから私ができるいくつかのbashを使用して:

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

これで、プロジェクトの各アプリのフィクスチャディレクトリ内にあるすべてのjsonファイルが展開されます。次の手順を実行するだけでテストできます。

ls */fixtures/*.json

于 2015-05-14T13:39:08.657 に答える
13

すべてのフィクスチャを取り込む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

(この種のアプローチは、特定のアプリに対してのみ単体テストを実行し、必要に応じて他のアプリを無視する場合にも適しています)

于 2010-02-09T14:38:54.097 に答える
13

このスレッドは、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']
于 2017-10-16T09:06:09.233 に答える
5

私の命令はこれです、簡単です。(django 1.6)

python manage.py loaddata a.json b.json c.json
于 2014-06-20T09:48:55.623 に答える
4

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)
于 2012-02-25T10:36:18.177 に答える
2

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
于 2020-12-25T11:21:51.477 に答える
1

Manage.py loaddataは特定の場所で自動的に表示されるため、各アプリでフィクスチャに同じ名前を付けるか、すべてのフィクスチャを同じフォルダに配置すると、すべてを簡単にロードできます。多くの異なるフィクスチャがあり、より複雑な命名スキーマが必要な場合は、findwith-execを使用してすべてのフィクスチャを簡単にロードできます。

探す 。-name "* .json" -exec manage.py loaddata {} \;

これで述べて[question][2]いるように、これもfabfileにあります。編集:manage.pyがVEパスにない場合は、pythonmanage.pyを使用してください。

于 2011-05-31T11:07:22.373 に答える
1

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
于 2020-03-23T14:17:09.867 に答える
0

少し検索した後、私はこのスクリプトを書くことになりました。「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))
于 2017-11-16T19:29:51.913 に答える
0

これは私にとってはうまくいきます。fixturesディレクトリ内のディレクトリにあるすべてのファイルを検索しますsrc

python manage.py loaddata \
    $(ls -1 src/**/fixtures/* | tr '\n' '\0' | xargs -0 -n 1 basename | tr '\n' ' ')
于 2019-01-25T05:51:11.240 に答える
0
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
于 2022-01-26T06:36:35.437 に答える