Django Queryset Design: Отфильтровать мягко удаленных пользователей?

У меня есть модель пользователя с мягким удалением в Django, где мы устанавливаем is_active значение False.

Но одна проблема, с которой я сталкиваюсь, заключается в необходимости отфильтровывать is_active пользователей на каждом типе контента:

  • Item.objects.filter(user__is_active=False, ...)
  • Comment.objects.filter(user__is_active=False, ...)
  • User.objects.filter(is_active=False, ...)

И так далее. Есть ли какой-то шаблон проектирования Django / Pythonic, который я могу использовать здесь, чтобы избежать необходимости вручную отфильтровывать всех пользователей каждый раз, когда я запрашиваю что-то, сделанное пользователем, или текущий список пользователей?

https://docs.djangoproject.com/en/4.0/topics/db/managers/

Вам необходимо использовать пользовательские менеджеры и добавить в модель. Вы можете переопределить метод get_queryset для фильтрации is_active.

Вы можете использовать ModelManager.

Например:


class ItemManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_active=True)

class Item(models.Model):
    .....
    objects = ItemManager() # your custom manager
    all_objects = models.Manager() # default manager

Теперь с Item.objects.all() вы получите объекты, имеющие только is_active=True.

Если вам нужны все объекты, то вы можете использовать Item.all_objects.all()

Вернуться на верх