diff --git a/aiogram/filters/callback_data.py b/aiogram/filters/callback_data.py index 7a09dedb..fde39761 100644 --- a/aiogram/filters/callback_data.py +++ b/aiogram/filters/callback_data.py @@ -120,9 +120,8 @@ class CallbackData(BaseModel): raise ValueError(f"Bad prefix ({prefix!r} != {cls.__prefix__!r})") payload = {} for k, v in zip(names, parts): # type: str, Optional[str] - if field := cls.model_fields.get(k): - if v == "" and not field.is_required(): - v = None + if v == "": + v = None payload[k] = v return cls(**payload) diff --git a/tests/test_filters/test_callback_data.py b/tests/test_filters/test_callback_data.py index e8721a41..e52e66b2 100644 --- a/tests/test_filters/test_callback_data.py +++ b/tests/test_filters/test_callback_data.py @@ -147,6 +147,15 @@ class TestCallbackData: assert MyCallback3.unpack("test3:experiment:42") == MyCallback3(bar=42) assert MyCallback3.unpack("test3:spam:42") == MyCallback3(foo="spam", bar=42) + def test_unpack_optional_wo_default(self): + """Test CallbackData without default optional.""" + + class TgData(CallbackData, prefix="tg"): + chat_id: int + thread_id: Optional[int] + + assert TgData.unpack("tg:123:") == TgData(chat_id=123, thread_id=None) + def test_build_filter(self): filter_object = MyCallback.filter(F.foo == "test") assert isinstance(filter_object.rule, MagicFilter)