一次加载多个灯具

时间:2010-02-08 21:39:57

标签: django django-fixtures

无论如何加载一个夹具并加载多个夹具?

我最好输入:

python manage.py loaddata all_fixtures

然后加载所有数据而不必输入所有内容。这可能吗?

11 个答案:

答案 0 :(得分:26)

使用$ python manage.py loaddata myfixtures/*.json将起作用,因为Bash会将通配符替换为匹配文件名列表。

答案 1 :(得分:10)

为什么不创建一个可以拉入所有灯具的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

然后在shell提示符下运行

make load_all_fixtures

(这种方法也适用于仅对某些应用程序执行单元测试,如果需要则忽略其他应用程序)

答案 2 :(得分:9)

我在项目目录中有多个应用程序,并且每个应用程序都有其“固定装置”和#39;目录。所以使用一些bash我可以做到:

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

这会扩展我项目中每个应用程序上fixtures目录中的所有json文件。您只需执行以下操作即可对其进行测试:

ls */fixtures/*.json

答案 3 :(得分:8)

这个主题显示在Google搜索的第一批结果中,并加载来自所有灯具的数据"并没有提到IMO是什么正确的解决方案,即允许您加载任何你想要的灯具的解决方案没有任何通配符技巧,也没有对settings.py文件进行单一修改(我也习惯这样做)

只需制作您的应用即可fixtures目录平面(而不是通常的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,为fIXTURE_DIRS中的每个目录搜索/foo/bar/mydata.json,以及文字路径foo / bar / mydata.json。

这意味着如果你的所有app目录中都有fixtures / myfixture.json,你只需要运行

./manage.py loaddata myfixture

加载项目中位于那里的所有灯具......就是这样!您甚至可以使用--app或--exclude参数来限制加载灯具的应用。

我提到我在进行一些开发时只使用我的灯具来填充我的数据库,所以我不介意在我的灯具中使用平面结构'目录...但即使你使用你的灯具进行测试,似乎有一个扁平的结构是Django式的方式,以及  that answer建议,您只需编写类似以下内容即可从特定应用中引用灯具:

class MyTestCase(TestCase):
    fixtures = ['app_name/fixtures/myfixture.json']

答案 4 :(得分:2)

如果你想在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)

答案 5 :(得分:1)

如果您的灯具位于同一文件夹中,则只需lsxargsls 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

答案 6 :(得分:1)

使用 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

答案 7 :(得分:0)

Manage.py loaddata会在某些地方自动显示,因此如果您在每个应用中为自己的灯具命名相同,或者将所有灯具放在同一个文件夹中,则可以轻松加载所有灯具。如果您有许多不同的灯具,并且需要更复杂的命名架构,则可以使用find with -exec轻松加载所有灯具

找到。 -name“* .json”-exec manage.py loaddata {} \;

正如我在[question][2]中所述,我也在fabfile中有这个。编辑:如果manage.py不在您的VE路径中,请使用python manage.py。

答案 8 :(得分:0)

我的命令很简单。 (django 1.6)

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

答案 9 :(得分:0)

在做了一些搜索之后,我最终编写了这个脚本。它搜索.json文件名为“fixtures”的所有目录,并运行“python manage.py loaddata {fixture_name} .json”。有时排序对于外键约束很重要,因此如果无法解析约束,它会在队列中留下一个夹具。

(注意:它需要我写的pip包simple_terminal。我把它设置为'python manage.py runscript'运行,这需要django-extensions。)

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

答案 10 :(得分:0)

这对我来说很好;它会找到fixtures目录内src目录中的所有文件:

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