2014-09-13 20 views
8

的Django 1.7之前,我用来定义每个项目fixtures目录中的设置:如何按项目创建initial_data灯具在Django 1.7+

FIXTURE_DIRS = ('myproject/fixtures',) 

,并用它来把我initial_data.json灯具存储默认群体对整个项目至关重要。这对我来说工作得很好,因为我可以通过从应用程序特定的数据中分离出每个项目的数据来保持设计的清洁。

现在与Django 1.7,initial_data固定装置已被弃用,suggesting包括data migrations与应用程序的模式迁移;没有明显的选择全球每个项目的初始数据。

此外新migrations framework安装所有遗留初始数据固定装置兼容的应用程序(包括应用django.contrib.auth之前执行迁移。此行为导致我的夹具包含默认组失败安装,因为auth_group表不存在于数据库中。

关于如何(优雅地)使灯具运行所有迁移,或至少在身份验证应用程序迁移后的任何建议?或者任何其他想法来解决这个问题? 我发现夹具是一种提供初始数据的好方法,并希望有一种简单而干净的方式来声明它们用于自动安装。新的RunPython太麻烦了,我认为它对于大多数目的来说是一种矫枉过正;它似乎只适用于每个应用程序的迁移。

+0

由于它被弃用,它可能会有点尴尬。一种选择可能是创建一个最小的应用程序来仅加载初始数据,创建迁移,并在RunPython中调用Django用于加载Fixture的任何函数。这样你也可以在你的迁移中指定依赖关系。这可能会涉及一些严重挖掘Django源代码。 – 2014-09-17 14:16:16

+2

是的,我已经创建了一些* meta *应用程序作为最后的手段,并在那里创建迁移(但它仍然很难看)。不知道为什么新的Django至少没有提供**声明式的标准方式**指定要与新迁移一起加载的装置。 – 2014-09-17 19:45:00

+0

因此有人建议重用1.7以前的json/xml fixture文件。你只需要一个简单的数据迁移应用程序,然后解析你现有的json/xml设备并从它们创建记录。无论如何,这应该是发生在1.7之前的事情。 – 2014-10-09 09:04:57

回答

4

如果您绝对想使用灯具,只需在您的数据迁移中使用RunPythoncall_command即可。

from django.db import migrations 
from django.core.management import call_command 

def add_data(apps, schema_editor): 
    call_command('loaddata', 'thefixture.json') 

def remove_data(apps, schema_editor): 
    call_command('flush') 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('roundtable', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(
      add_data, 
      reverse_code=remove_data), 
    ] 

然而,这是建议报告加载使用Python代码和Django的ORM,你将不必面对完整性问题的数据。

Source

+1

这是正确的答案,并且似乎来自对这个话题的精彩讨论。 http://andrewsforge.com/article/upgrading-django-to-17/part-2-migrations-in-django-16-and-17/#initial-data-fixtures-and-data-migrations – shacker 2014-11-15 15:35:05

+0

我刚刚看过Andrew Pinkham的[talk](https://www.youtube.com/watch?v=bjIXZ-XX2SM)很好地解释了这一点,所以这看起来确实是一个很好的选择。正如他所说:“initial_data系统与迁移一起使用时是个问题”;所以这就是为什么“初始数据系统消失了,但灯具不是”。 – 2014-11-18 17:43:46

+1

警告:如此处所示的'flush'命令将删除_all_数据,而不仅仅是来自转发迁移的数据 – wim 2015-12-16 23:04:57

1

我推荐使用工厂代替灯具,它们很混乱,难以维护,最好使用FactoryBoy和Django。

+1

我不认为灯具难以维护,它们一直是一个非常受欢迎的工具,而且它们是内置功能。使用FactoryBoy等第三方应用程序来处理加载数据这样的简单任务并不是那么舒服。我认为这是一个矫枉过正的目的。毕竟,FactoryBoy适用于复杂的单元测试,作为先进的数据生成器。这远远落后于我的目的范围 - 简单的静态数据加载器。不过谢谢你的提示。 – 2014-10-24 14:03:48