Преобразование ключей/значений request.POST в строки с помощью функции
Я пытаюсь записать значения из request.POST в строковый формат. По умолчанию они всегда начинаются с "epochs-NUMBER-". Поэтому я должен создать цикл For так, чтобы для каждого числа создавалась новая строка.
Редактирование: Запрос исходит от динамической формы Django, в которой нет статических элементов (эпохи динамические). Это стандартный POST-запрос Python. Единственное, что объединяет эти элементы, это то, что все они начинаются одинаково (эпохи-число и т. д.). Запрос обрабатывается через строку (nmea_sting-Function) в файл с помощью Python.
Полный запрос выглядит так. Но мне нужны только значения 'epochs-NUMBER-'
csrfmiddlewaretoken=hJmSuP3O6GmtwBeJhfqb99LaCVOKxgngGNIEqoqhQQR7tQELUVGHeXRXxfnRE1Ah&base-TOTAL_FORMS=1&base-INITIAL_FORMS=0&base-MIN_NUM_FORMS=0&base-MAX_NUM_FORMS=1000&base-0-time=25.06.2024+13%3A36%3A00&base-0-show_differences=on&base-0-show_null=1&source=Manual&epochs-TOTAL_FORMS=3&epochs-INITIAL_FORMS=3&epochs-MIN_NUM_FORMS=0&epochs-MAX_NUM_FORMS=1000&unit_selector=m&unit_selector=m&unit_selector=m&unit_selector=m&epochs-0-target_name=250.01.G&epochs-0-easting=55555&epochs-0-northing=5555&epochs-0-height=555&epochs-0-azimuth=&epochs-0-zenithangle=&epochs-0-slope_dist=&epochs-1-target_name=170.01.G&epochs-1-easting=44646&epochs-1-northing=6554&epochs-1-height=544&epochs-1-azimuth=&epochs-1-zenithangle=&epochs-1-slope_dist=&epochs-2-target_name=150.01.G&epochs-2-easting=78979878&epochs-2-northing=4645&epochs-2-height=455&epochs-2-azimuth=&epochs-2-zenithangle=&epochs-2-slope_dist=
Запрос выглядит следующим образом:
Редактирование: Одна цель - epochs-0-etc, следующая - epochs-1-etc. и так далее. К сожалению, мое решение работает только для одной цели на данный момент (epochs-0-etc)
def nmea_string(self, request, target_name):
my_dict = {}
keys = []
values = []
target_raw_string = ("PTER," + self.short_name + "_TRG," + target_name + "," +
self.time.strftime("%Y-%m-%d %H:%M:%S") + "," + str(self.status_target))
for key, value in request.POST.items():
keys.append(key)
values.append(value)
for i in range(len(keys)):
my_dict.update({keys[i]: values[i]})
for k, v in my_dict.items():
if k.startswith('epochs-0-'):
if v == '':
v = '-9999.999900'
if k.startswith('epochs-0-target_name'):
target_raw_string += "," + v
else:
target_raw_string += "," + v + ",0.000000"
tg_checksum = self.get_checksum(target_raw_string)
tg_nmea_string = "$" + target_raw_string + "*" + tg_checksum + "\n"
nmea_string += tg_nmea_string
return nmea_string
Конечный результат должен выглядеть примерно так:
$PTER,TS_TRG,250.01.G,2024-04-22 23:00:00,129,675666.252000,0.000000,252132.398000,0.000000,412.137000,0.000000,-9999.999900,0.000000,-9999.999900,0.000000,-9999.999900,0.000000*1F
$PTER,TS_TRG,170.01.G,2024-04-22 23:00:00,129,675704.440000,0.000000,252162.055000,0.000000,412.341000,0.000000,-9999.999900,0.000000,-9999.999900,0.000000,-9999.999900,0.000000*1A
Используйте регулярные выражения, чтобы проверить, является ли это эпохой, а также номер эпохи и имя поля:
for k, v in my_dict.items():
match = re.match(r"epochs-(\d+)-(.+)", k)
if not match:
continue
epoch, field_name = match.groups()
... # rest of your processing
Попутное замечание:
Строка запроса выглядит так, как будто она была создана из formset. Почему бы просто не проверить набор форм, а затем сгенерировать строку из очищенных данных отдельных форм? Формы будут расположены в правильном порядке, а cleaned_data
содержит только имена полей без префиксов, так что вам не придется использовать регекс. Значения также будут проверены.
Может быть, что-то вроде этого:
formset = YourFormsetClass(request.POST)
if formset.is_valid():
for form in formsets.forms:
target_raw_string = ""
for k, v in form.cleaned_data.items():
if v == '':
v = '-9999.999900'
if k == "target_name":
target_raw_string += "," + v
else:
target_raw_string += "," + v + ",0.000000"
Без использования regex вы могли бы получить следующее:
from typing import Any
def find_epochs_metrics(request_data: dict[str, Any]):
for k, v in request_data.items():
if not k.startswith("epochs-"):
continue
k_split = k.split("-")
epoch_n = k_split[1]
if not epoch_n.isdigit():
continue
field_name = k_split[2]
...
Вам следует постараться свести к минимуму использование regex, поскольку они неэффективны и сложны в обслуживании.