Вставить словарь со значениями списка в базу данных в web2py - PullRequest
0 голосов
/ 20 марта 2020

Здравствуйте, у меня есть ajax отправка данных на мой контроллер, как показано ниже

<Storage {'transaction_charge': ['1100', '1100'], 'min_amount': ['10000', '20001'], 'max_amount': ['20000', '50000'], 'admin_charge': ['1500', '3000'], 'other_charge': ['30', '60']}>

Я могу безопасно преобразовать это в словарь, значения ключа которого являются списками, как показано ниже

{'transaction_charge': ['1100', '1100'], 'min_amount': ['10000', '20001'], 'max_amount': ['20000', '5000'], 'admin_charge': ['1400', '3000'], 'other_charge': ['80', '70']}

У меня также есть таблица базы данных с именами, совпадающими с именами ключей в указанном выше наборе данных, я хотел бы опубликовать это в базе данных таким образом, чтобы каждое значение списка создавало новую запись в база данных, например

id | min_amount | max_amount | admin_charge | transaction_charge | other_charge
1  | 10000      | 20000      | 1500         | 1100               | 30
2  | 20001      | 50000      | 3000         | 1100               | 60

ПРИМЕЧАНИЕ поля моей таблицы являются динамическими c, они могут измениться, если пользователь добавит другой тип сборов, поэтому я не хочу явно добавлять эти Есть ли способ, которым web2py может быть достаточно умным, чтобы читать эти ключи и сопоставлять их значения списка со столбцами таблицы в некотором виде l oop, поэтому он создает len(ajax_data['key') записей в базе данных?

Спасибо вы

1 Ответ

0 голосов
/ 20 марта 2020

Хорошо, у web2py есть хороший способ фильтрации словаря, чтобы он включал только ключи, которые соответствуют полям таблицы: _filter_fields

Вы захотите преобразовать свои опубликованные данные из списка списков в список адресов Например:

data = [
  {
    'transaction_charge': '1100', 
    'min_amount': '10000', 
    'max_amount': '20000', 
    'admin_charge': '1400', 
    'other_charge': '80', 
  },
  {
    'transaction_charge': '1100', 
    ...
  }
]

Затем вы можете l oop, отфильтровать и вставить:

for row in data:
  db.table_name.insert(**db.table_name._filter_fields(row))
...