Python Django选择性转储数据

Python Django选择性转储数据,python,django,database-design,django-models,Python,Django,Database Design,Django Models,是否可以有选择地筛选Django的dumpdata management命令输出的记录?我有几个模型,每个模型都有数百万行,我只想在一个模型中转储符合特定条件的记录,以及引用这些记录的所有外键链接记录 考虑这个用例。假设我有一个生产数据库,其中我的用户模型有数百万条记录。我还有其他几个模型(日志、交易、购买、书签等),都引用了用户模型。我想在我的Django应用程序上进行开发,我想使用真实的数据进行测试。然而,我的生产数据库太庞大了,我无法实际地拍摄整个产品的快照并在本地加载它。因此,理想情况下

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

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

有没有一个简单的方法可以做到这一点呢?

我认为可能值得一看


您将在中找到一些其他背景信息。

这不是对我的问题的简单回答,但我在Django的内置工具上找到了一些有趣的文档,它允许在不使用主键的情况下表示序列化记录。不幸的是,这看起来不像是完全集成到dumpdata中的,而且有一种完全依赖自然密钥的旧方法

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


大概,如果我在所有模型上实现了一个natural_key()方法,然后调用serializers.serialize([Users.objects.filter(criteria)],它应该接近实现我想要的。我可能需要编写一个函数来抓取所有FK引用,并将这些引用包括在传递给serialize()的对象列表中。

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


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

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

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, ...)


好问题。如果你想公开这些测试数据,有时你还想去掉一些字段(比如密码等等)。我不得不对这些代码进行一些调整,即使这样也有点低效,但这通常对我有效。是的,我也是:不适用于带外键的嵌套表,我使用了这个命令:
/manage.py dump\u object APP.HEAD\u OF_MODELS'*'>my_new\u fixture.json
我相信这里列出了其他类似但不完全相同的django工具:上面代码片段的固定/更新分支: