在Django中从数据转储中排除多个字段

0 投票
3 回答
2397 浏览
提问于 2025-04-16 23:07

有没有办法在导出数据库的时候,排除不同表中的某些字段?我只找到可以完全排除一个模型的方法。(我在使用postgresql)。任何帮助都非常感谢。提前谢谢大家!

3 个回答

-1

你可以把数据保存到一个JSON文件里,然后用Notepad++或者类似的软件,把包含你字段名的每一行都删掉。这对我来说很有效,而且速度也很快。确保你的字段名是独一无二的,这样就不会删掉其他的行。

1

一个可能的技巧是定义一个新模型,只包含部分字段,并设置 managed=False,同时在 Meta 中重写 db_table 字段。

你也可以通过定义一个公共的抽象父模型,来避免重复定义一些共同的字段。

class CommonBase(models.Model):
    class Meta:
        abstract = True

class ModelX(CommonBase):
    pass

class SubsmetOfModelX(CommonBase):
    class Meta:
        managed = False
        db_table = 'app_label_modelx'

这种方法的缺点可能包括:

  • 在使用 dumpdata 时,至少需要排除上面提到的两个模型中的一个,否则 dumpdata 会包含重复的对象。
  • 如果 ModelX 中有任何 null=False 的字段,而这些字段在子集模型中没有,那么对 SubsetOfModelX 使用 loaddata 时会失败。
1

这事儿不太简单。我建议你从Django的源代码里拿一份dumpdata.py的文件,放到你的项目里,然后根据自己的需要进行修改。其实,把它改成使用自定义管理器来导出数据,或者扩展排除功能以支持app.model.field,这些都不是太难。

听起来这是个挺有用的扩展功能。

撰写回答