【问题标题】:Django table rows are being magically hidden from ORM when I set a 'deleted' flag当我设置“已删除”标志时,Django 表行被 ORM 神奇地隐藏了
【发布时间】:2017-12-28 02:03:42
【问题描述】:

在继承的代码库中工作。

当我从 API 或管理站点查看时,我有一个包含 2 个对象的表,但当我在 PostgreSQL 中执行 select * 时,它有 3 个对象。

 name  |            created            | deleted
-------+-------------------------------+------------
 Sweet | 2017-07-21 16:31:28.556949-05 | t
 qwer  | 2017-07-21 16:36:03.096954-05 | t
 asdf  | 2017-07-21 16:35:15.585589-05 | f
(3 rows)

该表中有一个“已删除”标志,似乎是一个自动软删除标志。如果我通过 SQL 将标志设置为 true,则它对 ORM 可见。如果我通过 SQL 将标志设置为 false,则它对 ORM 是隐藏的。

这种特殊类型的自动魔法非常无用,我想禁用它,但我想在删除该列之前了解它在 Django 中的工作原理。

我没有使用任何特殊的东西来支持这种行为。我找到了描述如何通过子类化支持它的特殊模型来实现软删除的文章,但我没有这样做。这只是models.Model 的一个普通子类。我在 Django 文档中进行了谷歌搜索和搜索,但没有看到任何表明只有“已删除”列会导致您软删除的信息。

我的问题是:

  1. Django 是否有某种自动软删除支持?
  2. 如果是这样,我在哪里可以找到文档?
  3. 如果没有,是否还有其他一些我不理解的自动机制?

【问题讨论】:

  • Django 没有内置的软删除支持。这很可能使用自定义 QuerySetManager 类来实现。查找模型类上的 objects 属性,或设置为 QuerySetManager 实例的任何内容。
  • @knbk 谢谢,这正是发生的事情。有一个与模型关联的 Manager 类,其 get_queryset() 方法被删除。
  • 我在开发模式下记录我的 SQL 查询。您可能会更好地了解这种情况:https://stackoverflow.com/questions/4375784/log-all-sql-queries

标签: django postgresql orm


【解决方案1】:

@knbk 引导我找到答案:

有一个与模型关联的 Manager 类,其 get_queryset() 方法通过“已删除”标志过滤任何查询集操作。

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多