使用`get_or_create`时不隐藏软删除的实例

时间:2018-12-29 10:07:02

标签: python django django-models

假设您正在像这样修改经理中的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()方法。创建过程中,我们能否不遮蔽软删除的实例?

2 个答案:

答案 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()之类的方法,并且不会删除软删除的实例。