Google App Engine中动态表单货币对数据的获取与Datastore存储方案
嘿,我来帮你搞定这两个动态表单相关的问题!看起来你做的这个可添加/移除的货币对表单场景很典型,咱们一步步来解决:
1. 如何获取所有动态提交的表单参数
你之前的代码是静态获取单个货币对,但动态场景下,我们可以通过遍历请求里的所有参数,结合正则匹配来提取所有货币对。
举个具体的实现例子(基于你用的App Engine webapp框架):
import re def post(self): user_currency_pairs = [] # 先收集所有带编号的货币字段,按配对分组 pair_dict = {} for param_key in self.request.arguments(): # 匹配格式:currency_<编号>_<1或2> match_result = re.match(r'currency_(\d+)_(\d)', param_key) if match_result: pair_id = match_result.group(1) currency_pos = match_result.group(2) currency_value = self.request.get(param_key) # 把同一配对的两个货币存到字典里 if pair_id not in pair_dict: pair_dict[pair_id] = {} pair_dict[pair_id][currency_pos] = currency_value # 把字典里完整的配对转成列表(确保两个字段都存在) for pair in pair_dict.values(): if '1' in pair and '2' in pair and pair['1'] and pair['2']: user_currency_pairs.append( (pair['1'], pair['2']) ) # 现在user_currency_pairs就是所有有效的货币对了 # 后续可以用这个列表做存储或其他处理
这个方法的好处是不管用户加了多少个、删了中间哪些配对,都能准确收集到所有完整的货币对,不会遗漏。
2. Datastore数据结构设计方案
针对动态货币对的存储,有两种常用的方案,你可以根据自己的业务需求选:
方案一:独立实体存储每个货币对
这种方案把每个货币对作为单独的Datastore实体,和用户绑定:
class CurrencyPair(db.Model): user = db.EmailProperty(required=True) currency_from = db.StringProperty(required=True) # 对应currency_n_1 currency_to = db.StringProperty(required=True) # 对应currency_n_2
- 优点:
- 灵活度高,后续可以单独修改、删除某个货币对,不需要更新整个用户的实体
- 适合货币对数量较多(比如可能超过几十个)的场景
- 缺点:
- 查询用户所有货币对时,需要做一次带过滤条件的查询(
CurrencyPair.all().filter('user =', user_email))
- 查询用户所有货币对时,需要做一次带过滤条件的查询(
方案二:嵌入实体存储所有货币对
如果用户的货币对数量不会太多(比如最多几十个,不超过Datastore实体的1MB大小限制),可以把所有货币对嵌入到用户的主实体里:
# 先定义一个嵌入模型,代表单个货币对 class CurrencyPair(db.EmbeddedModel): currency_from = db.StringProperty(required=True) currency_to = db.StringProperty(required=True) # 用户的货币存储实体 class UserCurrency(db.Model): user = db.EmailProperty(required=True) currency_pairs = db.ListProperty(CurrencyPair, required=True)
- 优点:
- 查询一次就能拿到用户的所有货币对,不需要额外的关联查询
- 数据结构更紧凑,适合小量数据的场景
- 缺点:
- 修改单个货币对时,需要更新整个实体(取出所有配对,修改后再存回去)
- 货币对数量太多会达到实体大小限制
怎么选?
如果你的场景里用户添加的货币对通常很少(比如10个以内),选方案二更方便;如果用户可能添加大量货币对,或者需要单独操作某个对,选方案一更合适。
内容的提问来源于stack exchange,提问作者Kevin Ling
相关产品推荐
相关产品推荐

