Python 管理器中的链接查询集
我正在寻找一种方法,在需要软删除的模型上使用queryset重用这个抽象模型/管理器,但我的一些模型已经有自定义的管理器/查询集。理想情况下,我希望所有其他经理都使用Python 管理器中的链接查询集,python,django,Python,Django,我正在寻找一种方法,在需要软删除的模型上使用queryset重用这个抽象模型/管理器,但我的一些模型已经有自定义的管理器/查询集。理想情况下,我希望所有其他经理都使用SoftDeletemanager/queryset,这样他们总是只返回未删除的项目。在Django 1.10中有没有实现这一点的方法 class SoftDeleteQuerySet(QuerySet): def delete(self): for obj in self: obj.
SoftDelete
manager/queryset,这样他们总是只返回未删除的项目。在Django 1.10中有没有实现这一点的方法
class SoftDeleteQuerySet(QuerySet):
def delete(self):
for obj in self:
obj.is_active = False
obj.save()
def undelete(self):
for obj in self:
obj.is_active = True
obj.save()
class SoftDeleteManager(Manager):
def get_queryset():
return SoftDeleteQuerySet(self.model, using=self._db).filter(is_active=True)
class SoftDelete(Model):
is_active = m.BooleanField(default=True)
objects = SoftDeleteManager()
class Meta:
abstract = True
def delete(self):
self.is_active = False
self.save()
def undelete(self):
self.is_active = True
self.save()
只需将模型的父类从
Model
更改为SoftDelete
:
class MyModel1(SoftDelete):
# ...
objects = MyModel1Manager()
对于您的经理来说:
class MyModel1Manager(SoftDeleteManager):
# ...
此外,对于get_queryset上的继承(如注释中所述),您应该使用如下内容:
class MyModel1Manager(SoftDeleteManager):
def get_queryset(self):
return super().get_queryset().filter(...)
你不需要链接,你需要继承。我猜你在考虑管理者继承,对吗?我尝试过管理器继承,但据我所知,您仍然必须重写
get\u queryset
,但我不知道如何实现它。这就是它的有趣之处。如果您想在super().get\u queryset()
上应用MyModel1QuerySet
方法,那么它必须有所不同。我认为再添加一个继承将解决这个问题(MyModel1QuerySet
也应该继承自SoftDeleteQuerySet
)。基本上,您的模型、管理器和查询集应该继承自SoftDelete
。