Filtering events aiogram

Заголовок вопроса: Проблемы с логическим 'AND' в фильтрах aiogram 3.2

Тело вопроса: Я использую aiogram версии 3.2 для создания Telegram-бота и столкнулся с проблемой при фильтрации callback-ивентов. Я хочу, чтобы мой обработчик событий срабатывал только тогда, когда выполняются два условия, но сталкиваюсь с трудностями при реализации логического 'AND'.

Вот пример моего кода:

from aiogram import F, Router
from aiogram.types import CallbackQuery, Message
from aiogram.filters.callback_data import CallbackData
# [Остальные импорты опущены для краткости]

class ExampleData(CallbackData, prefix='foo'):
    action: str
    id: int

# [Остальной код опущен для краткости]

@router.callback_query(
    ExampleData.filter(
        F.action == 'help',
        F.id == 0
    )
)
async def com_annswer(cb: CallbackQuery, callback_data: CallbackData):
    # [Обработка события]

Когда я использую фильтр ExampleData.filter(F.action == 'help', F.id == 0), я получаю ошибку TypeError: CallbackData.filter() takes from 1 to 2 positional arguments but 3 were given. Однако, когда я изменяю его на ExampleData.filter(F.action == 'help' and F.id == 0), условие работает как 'OR', срабатывая, если хотя бы одно из условий верно.

Как мне корректно реализовать логическое 'AND' в этом контексте?

То есть com_annswer() среагирует если F.action == 'lol' но F.id == 0


Ответы (1 шт):

Автор решения: SavLex

Нашел решение.

Чтобы фильтровать с помощью 'AND' нужно использовать примерно такой код

@router.callback_query(
    ExampleData.filter(F.action == 'skip'),
    ExampleData.filter(F.id == 0), # Вынесен отдельно
)

То есть не в одном фильтре задавать условия (F.1 and F.2), а filter(F.1) filter(F.2).

→ Ссылка