Стратегия применения общего фильтра ко всем моим графеновым запросам в проекте django
Когда пользователя попросят удалить из системы, я удалю всю его личную информацию, такую как имя и адрес, из таблицы auth_user, но сохраню все его действия в системе для целей внутренней аналитики. Однако эта аналитика не должна отображаться в нашем фронтенде. Например, есть таблица 'training', и один из запросов, связанных с ней, - посмотреть, сколько пользователей в настоящее время зарегистрировано в тренинге. Если пользователь был удален, он не должен там отображаться.
К сожалению, я совершил ошибку, не создав пользовательскую модель пользователя в начале моего проекта Django, и теперь это кажется довольно хлопотным делом. Вместо этого я хочу иметь связанную модель, которая ссылается на модель User по умолчанию.
Я создал модель RemovedUser, которая просто отмечает, что пользователь был удален. Я знаю, что в модели по умолчанию есть поле 'is_active', но я не хочу его использовать, так как хочу сохранить различие между действительно полностью удаленными пользователями и неактивными. Вот модель
class RemovedUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
date_removed = models.DateTimeField(editable=False, default=timezone.now,
help_text='Date the user was removed')
Ничего причудливого.
Теперь, проблема, с которой я столкнулся, заключается в том, что у меня есть много запросов в моем graphql api. И для всех них мне нужно применить фильтр в текущей логике запроса, чтобы искать эту таблицу и смотреть, есть ли там пользователь, и если да, то не добавлять пользователя в результат.
Например:
class OrganizationQuery(graphene.ObjectType):
all_users = graphene.List(UserType, org_id=graphene.Int())
и его резольвер:
def resolve_all_users(root, info, org_id):
user_ids = list_org_users(org_id)
users = get_user_model().objects.filter(id__in=user_ids).filter(~Q(removeduser__user_id__in=user_ids))
Это работает и достигает того, что я хочу, однако необходимость проходить через каждый запрос и добавлять это не только громоздко, но и требует, чтобы я всегда помнил, что должен делать это для каждого нового запроса или мутации в будущем.
Есть ли способ применить это для всех моих запросов? Я думал создать пользовательский декоратор, но я не совсем уверен, как добиться такой реализации.