Упрощение флагов при фильтрации моделей
У меня есть модель пользователя, которая имеет набор уведомлений:
class User(AbstractUser):
# Notification flags
send_to_all = models.BooleanField(default=True)
send_to_me = models.BooleanField(default=True)
send_to_friends = models.BooleanField(default=True)
# ...
Я передаю их из front-end в мои представления, где я запускаю функцию send_notifications.
# ...
def update(self, request, *args, **kwargs):
# ...
send_notifications(request.data.get('send_to_all', False))
# ...
А в send_notifications я хочу запросить User.objects.filter() и включить только те, у которых флаг, переданный из front-end, установлен в True.
Мой вопрос:
Есть ли способ упростить это? Я спрашиваю, потому что есть много вариантов уведомлений, около 20. И в настоящее время мой код имеет 20 ifs:
def send_notifications(flag):
if flag == 'send_to_all':
users_to_send = User.objects.filter(send_to_all=True)
if flag == 'send_to_me':
users_to_send = User.objects.filter(send_to_me=True)
if flag == 'send_to_friends':
users_to_send = User.objects.filter(send_to_friends=True)
if flag == 'another_send_flag':
users_to_send = User.objects.filter(another_send_flag=True)
if flag == 'another_send_flag':
users_to_send = User.objects.filter(another_send_flag=True)
Спасибо!
Вы можете обернуть User.objects.filter()
с eval так:
users_to_send = eval(f"User.objects.filter({flag}=True)")
Предположим, что User.objects
- это список, содержащий объекты с атрибутом send_to_all
users_to_send = list(filter(lambda x: x.send_to_all == True, User.objects))
или
users_to_send = [user for user in User.objects if user.send_to_all == True]