【问题标题】:django - Way to avoid custom manager for specific queriesdjango - 避免特定查询的自定义管理器的方法
【发布时间】:2020-03-14 20:06:19
【问题描述】:

我有以下问题:我正在开发一个使用在管理器中覆盖 get_queryset() 方法的模式的项目。

# Model declaration
class MyModel(models.Model):
    ...

    objects = MyModelManager()


# Manager declaration
class MyModelManager(models.Manager):

    def get_queryset(self):
        return super(MyModelManager, self).get_queryset().exclude(is_visible=False)

当你使用 django ORM 时,这会导致一些记录变得基本不可见。

我现在需要在某些极端情况下使用基本 get_queryset() 方法,而不是使用自定义方法。

我可以清理和更改所有代码,但工作量很大。

所以我的问题是:有没有办法进行这样的查询 MyModel.objects.all() 并避免使用自定义管理器方法?

希望我的观点足够清楚。

谢谢,
罗恩

【问题讨论】:

  • 只需添加另一个经理。
  • 我的用例是一个匿名数据库的工具。我调用了一个需要查找所有记录的管理命令。

标签: django django-orm django-managers


【解决方案1】:

您可以将多个经理添加到您的模型中。例如:

class MyModelManager(models.Manager):

    def get_queryset(self):
        return super(MyModelManager, self).get_queryset().exclude(is_visible=False)


class MyModel(models.Model):
    # …

    objects = MyModelManager()
    all_objects = models.Manager()

如果您随后需要 所有 对象,则可以使用 MyModel.<b>all_objects</b>.all() 访问这些对象。

【讨论】:

  • 我想过这个问题,但希望我认为我可以在这个工具中构建一个更通用的解决方案:pypi.org/project/django-scrubber 所以我为大家解决了这个问题。
【解决方案2】:

您可以使用另一个不覆盖 get_queryset() 方法的自定义管理器,如果您使用不同的名称而不是普通的 objects 名称,您只需定义一次自定义管理器会更好。

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 2022-10-19
    • 2016-07-28
    • 2019-05-26
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2013-12-04
    • 2019-06-17
    相关资源
    最近更新 更多