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