自动加载Django夹具

fzsnzjdm  于 2023-10-21  发布在  Go
关注(0)|答案(3)|浏览(96)

我正在运行Django 1.7。我的项目的文件树是这样的:

/project/app/fixtures/initial_data.json
/project/app/settings.py

我知道我可以运行python manage.py loaddata app/fixtures/initial_data.json命令来填充我的数据库,但我想在python manage.py migrate运行时自动加载它。我的设置包括:

FIXTURE_DIRS = (
    os.path.join(BASE_DIR, '/app/fixtures/'),
)

但是在运行migrate时,fixture并没有被应用。有什么问题吗?

dl5txlt9

dl5txlt91#

恐怕不行,这不是你的问题,因为这是从Django 1.7开始就被弃用的:
这里读到
自动加载初始数据fixture ¶
自版本1.7起弃用:如果应用程序使用迁移,则没有自动加载fixture。由于Django 1.9中的应用程序需要迁移,因此这种行为被认为是不推荐的。如果要为应用加载初始数据,请考虑在数据迁移中执行此操作。
如果您创建了一个名为initial_data.[xml/yaml/json]的fixture,那么每次运行migrate时都会加载该fixture。这非常方便,但要小心:请记住,每次运行migrate时都会刷新数据。所以不要对你想要编辑的数据使用initial_data。
如果你真的想这样做,你可以随时定制你的manage.py

# import execute_from_command_line
    from django.core.management import execute_from_command_line

    # add these lines for loading data
    if len(sys.argv) == 2 and sys.argv[1] == 'migrate':
        execute_from_command_line(['manage.py', 'loaddata'])

    execute_from_command_line(sys.argv)

希望这对你有帮助。

xurqigkl

xurqigkl2#

遗憾的是,没有足够的分数来发表评论!这篇文章很老了……(Django 1.7 - 1.9)
更改Manage.py仍然是一个有效的选择去!

  • 提醒将“migrate”改为“makemigrations”

if len(sys.argv) == 2 and (sys.argv[1] == 'makemigrations'):
另外,对于那些不经常阅读注解的人,可以将JSON文件添加到“execute_from_command_line”函数中。
execute_from_command_line(['manage.py', 'loaddata', 'YourFileName.json'])
通过运行python manage.py makemigrations,它将自动加载在该文件中指定的固定装置数据。
不用说,每次运行该命令时,它都会覆盖对该fixture中的模型所做的任何数据修改。

3zwtqj6y

3zwtqj6y3#

我发现自己也有类似的要求。我需要用一个命令聚合和加载项目中所有应用程序的fixture。
python manage.py loaddata --all应该已经足够了,但由于一些奇怪的原因-我的项目设置中的FIXTURE_DIRS没有被读取。因此,我调整了manage.py文件。

...
from project.settings import FIXTURE_DIRS

def main():
    ...
     if len(sys.argv) > 1 and sys.argv[1] == "loaddata" and sys.argv[2] == "--all":
        for fixtures_folder in FIXTURE_DIRS:
            fixtures = [filename for filename in os.listdir(fixtures_folder) if filename.endswith(".json")]
            for fixture in fixtures:
                fixture_path = os.path.join(fixtures_folder, fixture)
                command = f"python manage.py loaddata {fixture_path}"
                os.system(command)
                print(f"{fixture_path} completed")
    else:
        execute_from_command_line(sys.argv)

python manage.py loaddata --all可以在将必要的更改迁移到DB后成功运行。

相关问题