Не скрывать мягко удаленные экземпляры при использовании `get_or_create` - PullRequest
0 голосов
/ 29 декабря 2018

Допустим, вы изменяете get_queryset в вашем менеджере примерно так

class VoteManager(models.Manager):

    def get_queryset(self):

        return super().get_queryset().filter(is_deleted=False)



class Vote(models.Model):

    objects = VoteManager()

Это работает, как и ожидалось, но проблема, когда вы используете что-то вроде get_or_create в модели голосования, создает экземпляр, даже если этоприсутствует в базе данных, потому что мы изменили метод get_queryset ().Разве мы не можем скрыть мягко удаленный экземпляр при создании ??

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

get_or_create() - это метод из Queryset (отметьте this ).Один из способов решения этой проблемы - создать собственный класс набора запросов и перезаписать этот метод, чтобы не скрывать экземпляры, удаленные программным способом.

Другой способ - создать менеджер и переопределить добавление метода 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(), и экземпляры, удаленные программным способом, не будут скрыты.

0 голосов
/ 29 декабря 2018

Вы также можете попробовать переопределить метод 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)
...