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 шт):
Нашел решение.
Чтобы фильтровать с помощью '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).