Django选择性Dumpdata

时间:2011-11-29 15:42:15

标签: python django database-design django-models

是否可以有选择地过滤Django的dumpdata管理命令输出的记录?我有几个模型,每个都有数百万行,我只想在一个符合特定条件的模型中转储记录,以及引用任何这些记录的所有外键链接记录。

考虑这个用例。假设我有一个生产数据库,其中我的用户模型有数百万条记录。我还有其他几个模型(日志,交易,购买,书签等)都引用了用户模型。我想在我的Django应用程序上进行开发,我想使用实际数据进行测试。但是,我的生产数据库是如此巨大,我无法实际拍摄整个事物的快照并在本地加载它。理想情况下,我希望使用dumpdata将50个随机用户记录和所有相关记录转储到JSON,并使用它来填充开发数据库。

有没有一种简单的方法可以实现这一目标?

5 个答案:

答案 0 :(得分:17)

我认为django-fixture-magic可能值得一看。

您可以在Scrubbing your Django database中找到一些其他背景信息。

答案 1 :(得分:6)

此代码段可能对您有所帮助(它遵循关系并将其序列化):

http://djangosnippets.org/snippets/918/

您也可以使用该管理命令,并覆盖您希望返回自定义查询集的模型的默认管理器。

答案 2 :(得分:3)

这不是我的问题的简单答案,但我在Django的内置natural keys feature上找到了一些有趣的文档,它们允许表示没有主键的序列化记录。不幸的是,它似乎并没有完全集成到dumpdata中,并且有一个旧的outstanding ticket完全依赖自然键。

似乎serializers.serialize()函数允许序列化特定模型实例的任意列表。

据推测,如果我在所有模型上实现了natural_key()方法,然后调用serializers.serialize([Users.objects.filter(criteria)]),它应该接近完成我想要的东西。我可能必须编写一个函数来抓取所有FK引用,并将它们包含在传递给serialize()的对象列表中。

答案 3 :(得分:0)

这是一个非常老的问题,但是我最近编写了一个自定义管理命令来做到这一点。它看起来与现有的dumpdata命令非常相似,除了它需要一些额外的参数来定义我要如何过滤查询集,并且它覆盖了get_objects函数以执行实际过滤:

def get_objects(dump_attributes, dump_values):
  qs_1 = ModelClass1.objects.filter(**options["filter_options_for_model_class_1"])    
  qs_2 = ModelClass2.objects.filter(**options["filter_options_for_model_class_2"])    
  # ...repeat for as many different model classes you want to dump...
  yield from chain(qs_1, qs_2, ...)

答案 4 :(得分:0)

我遇到了同样的问题,但我不想添加另一个包,并且代码段仍然不允许我过滤我的数据,我只想要一个临时解决方案

所以我想我自己为什么不覆盖 default manager 在那里应用我的过滤器,获取转储然后恢复我的代码。这当然太老套和危险,但对我来说是有道理的。

是的,我必须在实时服务器上 vim 代码,但您不需要重新加载服务器,因为通过 manage.py 运行命令会运行您当前的代码库,因此从最终用户的角度来看服务器基本上保持联系。

from django.db.models import Manager

class DahlBookManager(Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_edited=False)

class FriendshipQuestion(models.Model):
    objects = DahlBookManager()

然后运行 ​​dumpdata 命令完全符合我的需要,返回所有未编辑的问题。

然后我git checkout mymodelfile.py将其恢复为原始状态。

这绝不是一个好的解决方案,但它会使某人被解雇或被解救。