Упрощение флагов при фильтрации моделей

У меня есть модель пользователя, которая имеет набор уведомлений:

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]
Вернуться на верх