是否可以有选择地过滤Django的dumpdata管理命令输出的记录?我有几个模型,每个都有数百万行,我只想在一个符合特定条件的模型中转储记录,以及引用任何这些记录的所有外键链接记录。
考虑这个用例。假设我有一个生产数据库,其中我的用户模型有数百万条记录。我还有其他几个模型(日志,交易,购买,书签等)都引用了用户模型。我想在我的Django应用程序上进行开发,我想使用实际数据进行测试。但是,我的生产数据库是如此巨大,我无法实际拍摄整个事物的快照并在本地加载它。理想情况下,我希望使用dumpdata将50个随机用户记录和所有相关记录转储到JSON,并使用它来填充开发数据库。
有没有一种简单的方法可以实现这一目标?
答案 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
将其恢复为原始状态。
这绝不是一个好的解决方案,但它会使某人被解雇或被解救。