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)高
谢谢,我会研究一下的。