Python Django:使用默认过滤器扩展QuerySet

Python Django:使用默认过滤器扩展QuerySet,python,django,django-queryset,Python,Django,Django Queryset,我正试图在我的项目中实现一个软删除模型。为此,我希望能够在默认情况下过滤掉已删除的对象 同时,我希望将所有QuerySet筛选器保留在一个位置,并可以作为MyModel.objects访问。我还希望能够链接我的过滤方法,因此我希望使用MyQuerySet.as\u manager()作为此类模型的管理器 因此,看起来我需要扩展Django的QuerySet,但需要添加一个自定义的默认过滤器。然而,我不知道该怎么做 下面的代码看起来不是一个好主意 class MyQuerySet(models.Q

我正试图在我的项目中实现一个软删除模型。为此,我希望能够在默认情况下过滤掉
已删除的
对象

同时,我希望将所有QuerySet筛选器保留在一个位置,并可以作为
MyModel.objects
访问。我还希望能够链接我的过滤方法,因此我希望使用
MyQuerySet.as\u manager()
作为此类模型的管理器

因此,看起来我需要扩展Django的
QuerySet
,但需要添加一个自定义的默认过滤器。然而,我不知道该怎么做

下面的代码看起来不是一个好主意

class MyQuerySet(models.QuerySet):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self = self.filter(deleted=False)

我还试图弄清楚如何使用
管理器。从_queryset()
开始,我仍然不知道如何创建一个可重用的管理器,我可以继承这个管理器,并且可以添加自己的queryset方法,并且仍然具有默认筛选功能。

让我们从创建一个自定义管理器开始

class SoftDeleteManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(deleted=False)
创建自定义Queryset以添加自定义Queryset方法

class SoftDeleteQuerySet(models.QuerySet):
    def soft_delete(self):
         return self.update(deleted=True)

class CarQuerySet(SoftDeleteQuerySet):
      def with_color(self):
          pass
在您的模型中

class CarModel(models.Model):
     all_objects = models.Manager()
     objects =  SoftDeleteManager.from_queryset(CarQuerySet)()

让我们从创建自定义管理器开始

class SoftDeleteManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(deleted=False)
创建自定义Queryset以添加自定义Queryset方法

class SoftDeleteQuerySet(models.QuerySet):
    def soft_delete(self):
         return self.update(deleted=True)

class CarQuerySet(SoftDeleteQuerySet):
      def with_color(self):
          pass
在您的模型中

class CarModel(models.Model):
     all_objects = models.Manager()
     objects =  SoftDeleteManager.from_queryset(CarQuerySet)()

这种方法的问题是我无法从SoftDeleteQueryset继承。例如,我希望车型
汽车
驾驶员
都是可软删除的,但我希望汽车查询集的方法
采用颜色
制作,驾驶员比年轻,
高,并且希望所有这些方法只返回未删除的项目。对于管理者,我将无法同时执行
Driver.objects.higher\u than(1.80)、younger\u than(30)
Driver.objects.younger\u than(30)。higher\u than(1.50)
谢谢,我将对此进行研究。这种方法的问题是我无法从SoftDeleteQueryset继承。例如,我希望车型
汽车
驾驶员
都是可软删除的,但我希望汽车查询集的方法
采用颜色
制作,驾驶员比年轻,
高,并且希望所有这些方法只返回未删除的项目。有了经理,我就不能同时做
Driver.objects.比(1.80)高.比(30)年轻
Driver.objects.比(30)年轻.比(1.50)高
谢谢,我会研究一下的。