【问题标题】:Django Selective DumpdataDjango 选择性转储数据
【发布时间】:2012-01-08 22:59:14
【问题描述】:

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

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

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

【问题讨论】:

  • 好问题。有时,如果您想公开此测试数据,您还想删除一些字段(如密码等)。

标签: python django database-design django-models


【解决方案1】:

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

您可以在Scrubbing your Django database 中找到一些额外的背景信息。

【讨论】:

【解决方案2】:

这个 sn-p 可能对你有帮助(它遵循关系并将它们序列化):

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

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

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    这是一个非常古老的问题,但我最近编写了一个自定义管理命令来做到这一点。它看起来与现有的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, ...)
    
    

    【讨论】:

      【解决方案5】:

      我有同样的问题,但我不想添加另一个包,sn-p 仍然不允许我过滤我的数据,我只是想要一个临时解决方案

      所以我自己想为什么不覆盖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 将其恢复为原始状态。

      这绝不是一个好的解决方案,但它会导致某人被解雇或陷入困境。

      【讨论】:

        猜你喜欢
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        相关资源
        最近更新 更多