假设您正在像这样修改经理中的get_queryset
class VoteManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
class Vote(models.Model):
objects = VoteManager()
这可以按预期工作,但是在Vote模型上使用get_or_create
之类的问题时,即使它存在于数据库中,它也会创建一个实例,因为我们修改了get_queryset()方法。创建过程中,我们能否不遮蔽软删除的实例?
答案 0 :(得分:0)
您也可以尝试重写get_or_create方法。像这样:
class VoteQuerySet(models.query.QuerySet):
def get_or_create(...):
"""Your realization"""
class VoteManager(models.Manager):
def get_queryset(self):
return VoteQuerySet(model=self.model, using=self._db, hints=self._hints).filter(is_deleted=False)
答案 1 :(得分:0)
get_or_create()
是Queryset
中的方法(选中this)。解决此问题的一种方法是create your own queryset class,并覆盖此方法以不隐藏软删除的实例。
另一种方法是创建一个管理器并重写all()
方法,添加一个标志以从数据库(甚至是软删除的实例)返回所有项,如下所示:
class VoteManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
def all(self, force_all=False):
if force_all:
return super().get_queryset() # queryset with all items
return self.get_queryset() # queryset without soft-deleted items
现在您可以调用get_or_create()
,并且不会删除软删除的实例。
Vote.objects.all(force_all=True).get_or_create(**data)
Vote.objects.all(force_all=True)
返回带有数据库中所有项目的查询集。您可以通过此查询集调用诸如filter()
,get_or_create()
,update_or_create()
之类的方法,并且不会删除软删除的实例。