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()