Dynamic StatesGroup on aiogram 3.1.1

问题描述 投票:0回答:1

大家下午好。

我在一家为企业开发电报机器人的公司工作,主要堆栈是 Django / Aiogram 3.1.1。

目前我面临一项艰巨的任务,我想向其他人询问其实施的可能性。

简而言之,任务是这样的:

数据库包含一个带有调查问卷的表(字段标题)和一个与问题名称关联的表:问题验证的类型(验证号码、姓名、邮箱等),以及一个与用户关联的表以及问卷的答案。

调查问卷和类型 DBdiagram

我的任务是创建一种处理器来填写这些调查问卷中的问题。困难在于,事实上,我可以创建一个 StatesGroup 并这样写:

class QuestionsStates(StatesGroup):
    email = State()
    phone_number = State()
    full_name = State()
    # . . .

接下来,我将为每个状态创建处理程序,在接收并验证最后一个状态的数据后,处理程序会将数据发送到数据库,仅此而已。

@router.message(QuestionsStates.last_state)
async def send_data_to_backend(message: Message, state: FSMContext):
    user_answers = await state.get_data()
    
    # user_answer.get('')
    # send all data with user_id to backend

    # . . . 

但是问题来了。调查问卷中的问题可能会发生变化,其验证类型可能会发生变化,某些问题可能会被删除,等等。

其实我的问题是什么? aiogram 3.1.1上可以实现动态状态的创建吗?

我有一些想法,但我不确定,也许还有其他方法。

我很高兴在此事上得到任何建议和帮助。 预先感谢并祝您度过愉快的一周!

我的实现想法之一是创建一个每分钟运行一次的特定函数;它将根据调查问卷的名称添加新的州:

async def get_anketa_questions():
    questions_response = await django_get_questions()
    for data in questions_response:
        State(state=data.get('name'))
        # idk something like this(i haven't checked if this code will work)
python-3.x django telegram aiogram
1个回答
0
投票

我也遇到过这个问题。第一个想法是使用

setattr
方法来添加新状态,但是 aiogram 在幕后使用了一些我还不理解的复杂东西 - 由于额外的检查,它的工作原理并不那么简单。

而其中一种不安全又搞笑的工作方式就是使用

exec
功能

exec('''
class MySG(StatesGroup):
    first_state = State()
    second_state = State()
'''
)

StatesGroup
类生成代码。您可以动态生成此字符串,然后使用常用的
class.field
表示法或
getattr(class, 'method')
访问状态。

© www.soinside.com 2019 - 2024. All rights reserved.