大家下午好。
我在一家为企业开发电报机器人的公司工作,主要堆栈是 Django / Aiogram 3.1.1。
目前我面临一项艰巨的任务,我想向其他人询问其实施的可能性。
简而言之,任务是这样的:
数据库包含一个带有调查问卷的表(字段标题)和一个与问题名称关联的表:问题验证的类型(验证号码、姓名、邮箱等),以及一个与用户关联的表以及问卷的答案。
我的任务是创建一种处理器来填写这些调查问卷中的问题。困难在于,事实上,我可以创建一个 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)
我也遇到过这个问题。第一个想法是使用
setattr
方法来添加新状态,但是 aiogram 在幕后使用了一些我还不理解的复杂东西 - 由于额外的检查,它的工作原理并不那么简单。
而其中一种不安全又搞笑的工作方式就是使用
exec
功能
exec('''
class MySG(StatesGroup):
first_state = State()
second_state = State()
'''
)
为
StatesGroup
类生成代码。您可以动态生成此字符串,然后使用常用的 class.field
表示法或 getattr(class, 'method')
访问状态。